首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSBuild: DefineConstants值的建立

MSBuild: DefineConstants值的建立
EN

Stack Overflow用户
提问于 2015-03-10 11:50:48
回答 1查看 1.5K关注 0票数 1

我注意扩展我的csproj-file的csproj属性的当前值。我想作为后缀添加的字符串可以在C#上计算,如下所示:

代码语言:javascript
复制
Int32 min_year = 2009;
Int32 max_year = 2015;      
String result = String.Join(";", Enumerable.Range(min_year, max_year -
  min_year + 1).Select(n=>"NEWER_THAN_AUTOCAD_" + (n - 1)).ToArray());
// result: 
// NEWER_THAN_AUTOCAD_2008;NEWER_THAN_AUTOCAD_2009;
// NEWER_THAN_AUTOCAD_2010;NEWER_THAN_AUTOCAD_2011;
// NEWER_THAN_AUTOCAD_2012;NEWER_THAN_AUTOCAD_2013;
// NEWER_THAN_AUTOCAD_2014

我需要在MSBuild代码中做同样的逻辑..。我试着这样做:

代码语言:javascript
复制
$([System.String]::Join(`;`,[System.Linq.Enumerable]::Range(2009,[MSBuild]::Add(
[MSBuild]::Subtract($(CAD_Year),2009),1)).Select(n=>[System.String]::Concat(
"NEWER_THAN_AUTOCAD_"),[MSBuild]::Subtract(n,1).ToArray()))

但是我在DefineConstants属性中获得了这个表达式,而不是计算值。我怎么才能修好它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-10 19:29:50

首先:数一下你的括号:P,结尾少了一个。(但这与此无关)

第二:如果你想‘执行’一些特殊的函数,你必须每次使用$(),而不仅仅是第一个。所以这是不正确的:

代码语言:javascript
复制
<PropertyGroup>
  <MyDefineConstants>$([System.String]::Join(';',[System.Linq.Enumerable]::Range(2009,2012)))</MyDefineConstants>
</PropertyGroup>

这是正确的

代码语言:javascript
复制
<PropertyGroup>
  <MyDefineConstants>$([System.String]::Join(';',$([System.Linq.Enumerable]::Range(2009,2012))))</MyDefineConstants>
</PropertyGroup>

但是..。命名空间System.Linq.Enumerable在MsBuld中不可用。您不能使用所需的每个名称空间。这是出于安全原因。如果您真的想使用它,您必须设置环境变量MSBUILDENABLEALLPROPERTYFUNCTIONS=1,但我不建议这样做。

如果您想了解更多:尝试上的MSBuild属性函数

除此之外,Select方法并不是真正的方法。好吧,是的,但不是您通常通过编写myobject.method()来调用的那种。这是可拓方法

这只是句法-糖。当您编写Enumerable.Range(1, 5).Select(n => n*2)和编译器时,调用类似于这个Enumerable.Select(Enumerable.Range(1, 5), n => n*2)的方法--这就是您应该如何调用它的方式。

好了,别唠叨了.我认为简单的方式是最好的..。所以

代码语言:javascript
复制
<ItemGroup>
  <CadYear Include="2009" />
  <CadYear Include="2010" />
  <CadYear Include="2011" />
  <CadYear Include="2012" />
  <CadYear Include="2013" />
</ItemGroup>
<PropertyGroup>
  <DefineConstants>@(CadYear->'NEWER_THAN_AUTOCAD_%(Identity)')</DefineConstants>
</PropertyGroup>

你仍然需要设定年份,所以我认为如果你必须定义所有年份,这不会是一个不利因素。

或者..。如果你真的找到‘干净’/‘复杂’的解决方案。你只需要写内联任务。然后,您可以在C#中编写任何您想要的代码和任何复杂的代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28963000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档