如何使用MSBuild在项目属性中添加条件编译符号?

16

我陷入了一个境地,我有一个需要读取项目构建属性中设置的条件编译符号的MSBuild脚本。我在我的MSBuild脚本文件中有以下代码

  <PropertyGroup>
    <DefineConstants>$(DefineConstants);INTER</DefineConstants>
  </PropertyGroup>


  <Target Name="Compile">
    <Message Text="$(DefineConstants)"/>
    <MSBuild Projects="CustomAssemblyInfo.csproj" Targets="Rebuild"  Properties="DefineConstants=$(DefineConstants)" />
  </Target>

我原本以为 $(DefineConstants); 会包含设置的条件编译符号的值,我只需要将这些值后面添加任何内容,就像在此情况下添加 INTER ,但一些在项目属性中设置的值没有传递到这里。有人能帮忙看看我漏掉了什么吗?


不确定,但也许告诉我们你是如何在项目属性中设置该属性的会是个好主意……? - stakx - no longer contributing
我是以以下方式传递它们的 http://tinypic.com/r/1qgzle/8 - Afraz Ali
如果我尝试使用消息任务查看$(DefineConstants)中的值,例如 <Message Text="$(DefineConstants)"/>,它只显示;INTER,这意味着$(DefineConstants)中没有传递任何内容。 - Afraz Ali
这张图片是哪个项目的设置?你把消息任务放在哪里? - Mike Zboray
消息任务在 MSBuild 文件中,用于测试传递给它的值是什么。 - Afraz Ali
@AfrazAli:这些信息应该放在你的问题正文中,而不是评论区。请编辑你的问题,所有相关信息都应该在那里。谢谢! - stakx - no longer contributing
1个回答

28
通过 MSBuild 任务的 Properties 属性传递的属性被称为全局属性,与在命令行上使用/p:传递的属性相同。它们优先于任何其他属性或环境变量,即使那些被无条件定义的属性,例如你的 .csproj 中的 DefineConstants

通过首先传递自己的 DefineConstants,可以防止它稍后从 .csproj 中设置,因此要防止这种情况,您需要在项目属性窗口中添加类似于 $(Constants) 的内容,这将重新定义 DefineConstants<DefineConstants>TRACE;DEBUG;$(Constants)</DefineConstants> 并从您的 MSBuild/NAnt 脚本中传递 Constants

编辑:根据下面 @sǝɯɐſ 的评论

https://i.imgur.com/jZiVy7J.png

enter image description here


谢谢Illya,但我想知道为什么不能在msbuild文件中直接读取从项目属性传递的值? - Afraz Ali
在我的情况下,我只想读取传递进来的内容,然后在msbuild中附加一些常量。另外请注意,我有一个单独的XML文件用于MSBuild,我没有改变csproj本身。 - Afraz Ali
好的,现在我明白了,感谢您澄清这个概念! - Afraz Ali
非常感谢,帮了大忙! - Afraz Ali
1
你应该将那个截图添加到你的回答中!对我也有帮助,谢谢! - sǝɯɐſ
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接