4

我目前正在与一些喜欢设置定义环境特定变量而不是使用属性文件的 Ant 任务的开发人员合作。他们似乎更喜欢这样做,因为这样更容易输入:

ant <environment task> dist

比输入:

ant -propertyfile <environment property file> dist

例如:

<project name="whatever" default="dist">

<target name="local">
    <property name="webXml" value="WebContent/WEB-INF/web-local.xml"/>
</target>

<target name="remote">
    <property name="webXml" value="WebContent/WEB-INF/web-remote.xml"/>
</target>

<target name="build">
    <!-- build tasks here --->
</target>

<target name="dist" depends="build">
    <war destfile="/dist/foo.war" webxml="${webXml}">
         <!-- rest of war tasks here -->
    </war>
</target>

我发现很难让他们相信属性文件是正确的选择。我相信属性文件更好,因为:

  • 它们提供了更大的灵活性——如果您需要一个新环境,只需添加一个新的属性文件
  • 发生了什么更清楚了-您必须了解这个小“技巧”​​才能意识到他们正在完成什么
  • 不提供默认值和使用覆盖的能力 - 如果他们使用属性文件,他们可以在项目顶部提供默认值,但能够用文件覆盖它们
  • 如果未在命令行上提供环境任务,脚本不会中断

当然,他们听到的只是他们需要更改 Ant 脚本并且必须在命令行上输入更多内容。

您能否提供任何其他参数来支持属性文件而不是“属性任务”?

4

3 回答 3

15

属性任务将构建文件与环境紧密耦合。如果您的开发人员同事认为他们“必须根据您的建议更改他们的 ant 脚本”,那么他们为什么不争论每次必须部署到新环境时都更改它呢?:)

也许您可以说服他们同时允许属性文件和命令行配置。我设置了我的 Ant 构建,以便如果 build.properties 存在于与 build.xml 相同的目录中,它将读取它。否则它使用一组硬编码到构建中的默认属性。这是非常灵活的。

<project name="example">

    <property file="build.properties"/>

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

    ...
</project>

我没有为项目提供 build.properties(即 build.properties 在 SCM 中没有版本控制)。这样开发人员就不会被迫使用属性文件。我确实提供了一个开发人员可以参考的 build.properties.example 文件。

由于Ant 属性一旦设置,就是不可变的,构建文件将使用按以下顺序定义的属性:

  • 通过命令行提供-D-propertyfile通过命令行提供的属性
  • 从 build.properties 加载的属性
  • build.xml 中的默认属性

这种方法的优点:

  • 构建文件更小,因此更易于维护,不易出错
  • 无法摆脱在命令行设置属性的开发人员仍然可以使用它们。
  • 可以使用属性文件,但不是必需的
于 2009-01-14T18:11:01.927 回答
3

你的论点已经非常有说服力了。如果这些争论没有奏效,那么争论并不能解决问题。事实上,没有什么能解决问题。不要以为人是理性的,会做最实际的事情。他们的自负参与其中。

别吵了。即使你赢了,你制造的怨恨和恼怒也不值得。赢得争论可能比失败更糟糕。

做你的案子,然后放手。一段时间后,他们可能会决定改用你的方式(因为它实际上更好)。如果发生这种情况,他们会表现得好像这是他们自己的想法。不会提及你提出的。

另一方面,他们可能永远不会转换。

唯一的解决办法是朝着权威的位置努力,在那里你可以说出事情是如何做的。

于 2009-01-14T18:23:17.253 回答
0

第一个解决方案(使用 ant 属性)的问题基本上是硬编码。当您为自己开始一个项目时可能很方便,但很快您必须改掉这个坏习惯。

除了我直接提交了 build.properties 文件外,我使用的属性文件接近于 robhruska 所说的内容。这样你就有了一个默认的。

另一方面,我知道我可以在 build.xml 中添加这些默认值。(我可能会在接下来的几个小时/几天内尝试这样做;-))。

无论如何,我真的不喜欢第一种方法,我会强迫那些人遵循第二种方法......

于 2009-01-14T20:29:32.490 回答