我想要在CI服务器上构建一个解决方案,其中包含具有自定义目标的项目,如下所示:
<Target Name="CustomTarget">
<PropertyGroup>
<PackageOutputDir>C:\Repos\$(Configuration)</PackageOutputDir>
</PropertyGroup>
</Target>
不幸的是,<PackageOutputDir>
在某些项目的不同位置指定,因此我想将其设置两次。
在CI服务器上,我想使用msbuild二进制文件中的/property:
将其设置为另一个目录,如下所示:
msbuild my.sln /property:PackageOutputDir=$buildPath\ci-output;CustomTarget.PackageOutputDir=$buildPath\ci-output' does not set the value inside
CustomTarget`。由于我不控制源,我必须使用命令行传递值。
答案 0 :(得分:0)
您可以将PropertyGroup定义移出目标吗?如果执行此操作,则命令行提供的值将覆盖目标中定义中的值。
例如
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<PackageOutputDir>C:\Repos\$(Configuration)</PackageOutputDir>
</PropertyGroup>
<Target Name="CustomTarget">
<Message Text="PackageOutputDir is: $(PackageOutputDir)" />
</Target>
</Project>
使用args
msbuild go.build / p:PackageOutputDir =“你好 世界“
将产生"Hello World"
或者,MSBuild的优良做法是始终将您的属性定义为条件。
以下示例也将生成"Hello World"
,因为该属性不会在目标中进行评估,因为它已经从命令行获得了值。
<Target Name="CustomTarget">
<PropertyGroup>
<PackageOutputDir Condition="'$(PackageOutputDir)' == ''">C:\Repos\$(Configuration)</PackageOutputDir>
</PropertyGroup>
<Message Text="PackageOutputDir is: $(PackageOutputDir)" />
</Target>
答案 1 :(得分:0)
更改
msbuild my.sln /property:PackageOutputDir=$buildPath\ci-output;CustomTarget.PackageOutputDir=$buildPath\ci-output
到
msbuild my.sln /property:PackageOutputDir=$buildPath\ci-output;PackageOutputDir=$buildPath\ci-output
对于MSBuild属性,基本上没有范围概念,因此CustomTarget.
限定符不是必需的,并且破坏了预期的属性值赋值。