2014-07-01 20 views
1

似乎TeamCity参数$ {build.counter}没有在我们的ant build.xml中解析。我们有:build.xml中的T​​eamCity build.counter参数

<replaceregexp 
     file="AndroidManifest.xml" 
     match='android:versionCode="(.*)"' 
     replace='android:versionCode="${build.counter}"' 
/> 

这引发错误:

String types not allowed (at 'versionCode' with value '${build.counter}')

它看起来像它走的是参数 “$ {} build.counter” 作为一个字符串。

使用另一个TeamCity整数参数代替$ {build.counter},例如$ {teamcity.build.id},可以正常工作。

有谁知道这可能是为什么?

更新

感谢Biswajit_86的答案。这里也是我的related discussion with JetBrains

+0

你确定这个属性解析所有?尝试在此步骤之前添加' $ {build.counter}'。一个随机nitpick:你的正则表达式替换不使用捕获组引用,所以你的匹配模式不需要括号。 – CAustin

+0

@CAustin - 你是对的!这给了我“步骤2/2”echo $ {build.counter}“。那么为什么这个属性不会在其他人做的时候解决呢? –

+0

说实话,我对TeamCity一无所知。这是你所有的财产来自哪里,对吗?它看起来像是哪个文件保存了这些属性格式不正确,就好像它包含'build.counter = Step 2/2] echo $ {build.counter}'或类似的东西。 – CAustin

回答

3

你的构建文件根本不知道build.counter的值。他们只能读取系统属性,但build.counter是一个配置参数。

为此,请声明一个名为system.BUILD.COUNTER的系统参数,其值为%build.counter%并将其传递到您的目标中。如果你改变你的build.xml ABNT阅读$ {} BUILD.COUNTER,它会正常工作

构建参数部分 system.BUILD.COUNTER%build.counter%

构建XML文件

<replaceregexp 
     file="AndroidManifest.xml" 
     match='android:versionCode="(.*)"' 
     replace='android:versionCode="${BUILD.COUNTER}"' 
/> 
+0

这看起来很有趣,但其他人喜欢teamcity.build.id和build.number。他们在build.xml中解析得很好。他们和build.counter有区别吗? –

+0

你有没有使用build.id的例子。 build.number作为系统属性和env变量发布,由teamcity –

0

Ant不会直接读取teamctiy varaibles。你需要在你的像蚂蚁项目创建一个类似的build.counter属性:

<property name="build.conuter" value=""/> 

,并从TeamCity的构建步骤通过它的价值,如:

enter image description here

+0

发布我们不需要定义属性构建。计数器,它将设置为空字符串,然后不会更改 – user3584056

+0

它的值需要从TeamCity传递到其他Ant命令行参数中,该参数将覆盖默认的空白值。 –

+0

是真的,但对于哪些属性需要与'var' ant-contrib任务一起出现,我认为。另外,如果不使用ant命令行,可以将其设置为具有env变量的其他自定义变量,该变量可以在build.xml中使用$ {env.BUILD_COUNTER} – user3584056