我有以下
<RegexMatch Input="$(Configuration)" Expression="^.*?(?=\.)">
<Output ItemName="Theme" TaskParameter="Output" />
</RegexMatch>
我的配置变量如下:Theme.Environment
所以“Default.Debug” 或“黄色。发布”
我想把第一部分放到可变的主题中。 我已经测试了这个正则表达式,它可以在独立的正则表达式测试器中运行
^.*?(?=\.)
但在我的构建文件中使用时却没有。
我正在回显变量,以便我可以看到输出
<Exec Command="echo $(Theme)"/>
<Exec Command="echo $(Configuration)"/>
想法?
答案 0 :(得分:2)
如果您应该使用MSBuild社区任务 - 请检查以下行:<Output PropertyName="Theme" TaskParameter="Output" />
如果您想稍后引用PropertyName="Theme"
,请使用$(Theme)
。
ItemName
将创建项目集,而不是属性。
但使用MSBuild 4.0内联函数比使用Msbuild社区任务更简单。您的代码将如下所示(适用于您的脚本):
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTarget="Play">
<PropertyGroup>
<Configuration>Yellow.Release</Configuration>
</PropertyGroup>
<Target Name="Play">
<PropertyGroup>
<Theme>$([System.Text.RegularExpressions.Regex]::Match($(Configuration), `^.*?(?=\.)`))</Theme>
</PropertyGroup>
<Message Text="$(Theme)" />
<Message Text="$(Configuration)" />
</Target>
</Project>
答案 1 :(得分:0)
刚刚意识到RegexMatch会返回匹配的字符串,但如果匹配则会返回整个字符串。
基本上它叫做IsMatch方法而不是匹配方法
重新编写为RegexReplace
<RegexReplace Input="$(Configuration)" Expression="\..*" Replacement="" Count="1">
<Output ItemName="Theme" TaskParameter="Output" />
</RegexReplace>
之后它仍然没有工作,然后我意识到我正在做
$(Theme)
应该是
@(Theme)