有没有办法在NAnt中动态加载属性文件?

时间:2008-09-16 20:47:26

标签: .net build automation nant

我想基于一个变量加载不同的属性文件。

基本上,如果执行开发构建使用此属性文件,如果执行测试构建使用此其他属性文件,并且如果执行生成构建,则使用第三个属性文件。

4 个答案:

答案 0 :(得分:26)

第1步:在您的NAnt脚本中定义一个属性,以跟踪您正在构建的环境(本地,测试,制作等)。

<property name="environment" value="local" />

第2步:如果您还没有所有目标所依赖的配置或初始化目标,请创建配置目标,并确保其他目标依赖于它。

<target name="config">
    <!-- configuration logic goes here -->
</target>

<target name="buildmyproject" depends="config">
    <!-- this target builds your project, but runs the config target first -->
</target>

第3步:更新配置目标,根据环境属性提取相应的属性文件。

<target name="config">
    <property name="configFile" value="${environment}.config.xml" />
    <if test="${file::exists(configFile)}">
        <echo message="Loading ${configFile}..." />
        <include buildfile="${configFile}" />
    </if>
    <if test="${not file::exists(configFile) and environment != 'local'}">
        <fail message="Configuration file '${configFile}' could not be found." />
    </if>
</target>

注意,我希望允许团队成员定义他们自己的local.config.xml文件,这些文件没有提交给源代码控制。这为存储本地连接字符串或其他本地环境设置提供了一个好地方。

第4步:调用NAnt时设置环境属性,例如:

  • nant -D:environment = dev
  • nant -D:environment = test
  • nant -D:environment = production

答案 1 :(得分:5)

您可以使用include任务在主构建文件中包含另一个构建文件(包含您的属性)。 if任务的include属性可以测试变量以确定是否应该包含构建文件:

<include buildfile="devPropertyFile.build" if="${buildEnvironment == 'DEV'}"/>
<include buildfile="testPropertyFile.build" if="${buildEnvironment == 'TEST'}"/>
<include buildfile="prodPropertyFile.build" if="${buildEnvironment == 'PROD'}"/>

答案 2 :(得分:5)

我有一个类似的问题,scott.caligan的答案部分解决了,但我希望人们能够设置环境并加载适当的属性文件,只需指定一个目标如下:

  • nant dev
  • nant test
  • nant stage

您可以通过添加设置环境变量的目标来完成此操作。例如:

<target name="dev">
  <property name="environment" value="dev"/>
  <call target="importProperties" cascade="false"/>
</target>

<target name="test">
  <property name="environment" value="test"/>
  <call target="importProperties" cascade="false"/>
</target>

<target name="stage">
  <property name="environment" value="stage"/>
  <call target="importProperties" cascade="false"/>
</target>

<target name="importProperties">
  <property name="propertiesFile" value="properties.${environment}.build"/>
  <if test="${file::exists(propertiesFile)}">
    <include buildfile="${propertiesFile}"/>
  </if>
  <if test="${not file::exists(propertiesFile)}">
    <fail message="Properties file ${propertiesFile} could not be found."/>
  </if>
</target>

答案 3 :(得分:0)

我做这种事情的方式是根据使用nant task的构建类型包含单独的构建文件。可能的替代方案可能是使用iniread task in nantcontrib