2009-01-14 109 views
4

我目前正在与一些喜欢设置定义环境特定变量而非使用属性文件的Ant任务的开发人员合作。他们似乎更喜欢这样做,因为它更容易输入:通过“属性任务”使用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脚本,并且必须在命令行上输入更多内容。

你可以通过“属性任务”提供任何有利于属性文件的其他参数吗?

回答

15

属性任务将构建文件与环境紧密结合。如果你的开发人员争辩说他们“必须改变他们的蚂蚁脚本”,那么他们为什么不争论在每次部署到新环境时都要改变它? :)

也许你可以说服他们允许属性文件和命令行配置。我设置了我的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

  • 属性从生成加载
  • 属性.properties
  • 构建中的默认属性。这种方法的XML

优点:

  • 构建文件更小,因此更易于维护,更少的错误倾向
  • 开发者,只是不能在命令行从设置属性脱身仍然可以使用它们。
  • 属性文件可以使用,但不是必需的
3

你已经是相当有吸引力的参数。如果这些论点没有奏效,那么争论就不会解决问题。其实没有什么就是要解决这个问题。不要以为人们是理性的,会做最实际的事情。他们的自我介入。

停止争论。即使你赢了,你所创造的怨恨和烦恼也不值得。赢得争论可能比输家更糟。

让你的情况,然后让它离开。有可能一段时间后,他们会决定改变方向(因为它实际上更好)。如果发生这种情况,他们会表现得像他们自己的想法。将不会提到你提出了它。

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

唯一的解决方案是朝着一个权威的位置努力,在那里你可以说如何做。

+0

所以。诅咒。真正。 – sjas 2013-02-25 13:24:13

0

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

我正在使用属性文件接近什么说robhruska,但我已直接提交build.properties文件。这种方式你有一个默认的。

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

不管怎样,我真的不喜欢第一种方法,我将迫使那些家伙跟随第二个...