0

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

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

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

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

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

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

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

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

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

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

我希望有人可以帮助我。主要目标的外观示例附在帖子的末尾。我想从文本中读取值(键=值)并将它们分配给变量的地方直接位于条件之后。

干杯一月

<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>
4

1 回答 1

0

它就像一个魅力:)

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

<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" />

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

感谢您的帮助:)

于 2012-08-24T14:28:11.337 回答