在自定义目标中设置属性

时间:2018-05-30 10:39:58

标签: .net msbuild continuous-integration

我想要在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`。由于我不控制源,我必须使用命令行传递值。

2 个答案:

答案 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.限定符不是必需的,并且破坏了预期的属性值赋值。