【问题标题】:Is it possible to "unload"/discard properties read from a file when accessing a new target?访问新目标时是否可以“卸载”/丢弃从文件中读取的属性?
【发布时间】:2012-08-22 10:37:19
【问题描述】:

只是出于好奇...因为我 - 当然 - 想以这种方式实现它;)

我在一个脚本中有几个主要目标。他们每个人都为不同的地区和/或品牌构建​​软件包。

我的一些前辈已经解决了一个问题,即向目标提供要使用的参数/属性的信息。

这些条目确实在每个目标中出现了多次,并且某些值已添加/硬编码,即使属性已加载且可用。这种方法很容易出错。

这导致了很多麻烦,因为名称中的拼写错误导致目标使用混合变体属性而不是为每个目标指定的属性。 在某些情况下,显然懒惰确实成功了,因此不是搜索、打开和修改适当的变体属性文件,而是用于单个任务的不同文件。

我现在已经修改了脚本,每个目标在开始时只需要一个属性文件名,其余的 - 如果需要 - 在运行时组合。

到目前为止还不错,但之前可以连续构建多个目标,因为尚未在主目标中读取属性文件。

现在每个目标都必须逐步构建,因为后续目标将使用从第一个目标加载的初始属性。

我尝试过用不同的方式加载属性文件,用变量覆盖它,但到目前为止没有任何乐趣。 我试过 loadproperties>、property file=...>、propertyfile...> 都没有真正的帮助,因为属性可以' 不会被覆盖,除非你使用同名变量并取消设置它,这在这个特定点不起作用。 从外部发送的属性将被忽略,因为我必须在开始时初始化值,而且我不知道在构建之前将使用哪个值。

我认为将属性文件作为普通文本文件逐行读取,搜索相关条目并将它们分配给各个变量就可以了,但我不知道如何实现这一点: /

我希望有人可以帮助我解决这个问题。 主要目标的外观示例附在帖子的末尾。 我想从文本中读取值(key=value)并将它们分配给变量的地方就在条件之后。

干杯 一月

<target name="Int_XX_XX_XX" description="Create XX XX release (PCSim, Front, XX)">
    <condition property="skip.target">
        <istrue value="${skip_target}" />
    </condition>
    <loadproperties>
        <file file="variants/XX_XXXXXX_XX.properties"/>
    </loadproperties>
    <propertyregex property="sop.number" select="\2" input="${variant.release.label}" regexp="(\.*)_(SOP[0-9]*)" />
    <if>
        <or>
            <and>
                <available file="${variant.release.label}${variant.sub.region}.zip" />
                <istrue value="${variant.split.to.region}" />
            </and>
            <and>
                <available file="${variant.release.label}.zip" />
                <isfalse value="${variant.split.to.region}" />
            </and>
        </or>
        <then>
            <var name="bundle.exists" value="true" />
            <echo>${variant.release.label}.zip found. Skipping build target</echo>
        </then>
    </if>
    <if>
        <not>
            <istrue value="${bundle.exists}" />
        </not>
        <then>
            <echo>${variant.release.label}.zip not found. Accessing build target</echo>
            <antcall target="private.create.zip.and.pcsim">
                <param name="zip.dsitracer.client.asia" value="true" />
                <param name="variant.properties" value="variants/${variant.label}.properties" />
                <param name="echo.release.labels" value="false" />
            </antcall>
            <antcall target="private.echo.release.labels">
                <param file="variants/${variant.label}.properties" />
            </antcall>
            <antcall target="private.send.email.to.testers">
                <param name="variant.release.label" value="${variant.release.label}" />
                <param file="variants/${variant.label}.properties" />
            </antcall>
        </then>
    </if>
    <var name="bundle.exists" unset="true" />
</target>

【问题讨论】:

  • 有帮助吗?我没用过……只是在阅读文档时才知道。
  • 它应该可以工作,但由于某种原因它根本不起作用......我对 apache org 的示例保持严格,并出于我的目的对其进行了修改,但没有任何运气。 “create-release.xml:16:问题:创建任务或键入本地失败原因:名称未定义。操作:检查拼写。操作:检查是否已声明任何自定义任务/类型。操作:检查任何 / 声明已经发生。”然后我只是简单地将示例复制并粘贴到脚本中,结果是一样的。它在 处失败。也给它赋值并没有带来任何乐趣。
  • ant-contrib 在此示例中未使用,但它是系统的一部分。所以这不可能是原因。它只适用于 Ant 1.8 或更高版本,我们使用 Ant 1.8.2
  • 我去了另一个部门,对具有或多或少相同设置的不同构建系统进行交叉检查。它在那里工作......那么有什么区别?我像他们一样在eclipse中运行它,但也许有一些变化会导致这种行为?他们运行 Ant 1.8.1,I 1.8.2。 Ant-contrib:他们 0.3,我 0.3(即使在这种情况下不使用)

标签: ant properties


【解决方案1】:

它就像一个魅力:)

我不得不删除属性值的初始分配

<property name="foo" value="foo"/>

直接在 taskdef 之后,因为在主目标调用的同一脚本中有一些目标。这导致重新读取将值恢复为 foo 的属性值。 放弃初始化似乎没有任何害处。

所以我的构建脚本现在添加了以下内容:

<target name="Int_XX_XX_XX" description="Create XX XX release (PCSim, Front, XX)">
    <condition property="skip.target">
        <istrue value="${skip_target}" />
    </condition>
    <local name="variant.property.file.name" />
    <local name="variant.release.label" />
    <local name="variant.sub.region" />
    <local name="variant.split.to.region" />
    <local name="variant.label" />
    <local name="variant.label.extended" />
    <property name="variant.property.file.name" value="XX_XXXXXX_XX" />
    <loadproperties>
        <file file="variants/${variant.property.file.name}.properties" />
    </loadproperties>

而不是

    <target name="Int_XX_XX_XX" description="Create XX XX release (PCSim, Front/Rear, XX)">
    <condition property="skip.target">
        <istrue value="${skip_target}" />
    </condition>
    <loadproperties>
        <file file="variants/XX_XXXXXX_XX.properties" />
    </loadproperties>

顺便说一句

        <local name="variant.release.label" />
    <local name="variant.sub.region" />
    <local name="variant.split.to.region" />
    <local name="variant.label" />
    <local name="variant.label.extended" />

是主要目标中也使用的属性,子级别上的目标确实使用从最近的属性文件中读取的属性并在以后按预期丢弃它们。

感谢您的帮助:)

【讨论】:

    猜你喜欢
    • 2017-04-24
    • 2013-02-07
    • 2022-01-01
    • 2013-06-24
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多