MSBuild:如何创建包含多个<exec>任务的参数化内联任务

时间:2018-09-20 10:38:08

标签: visual-studio msbuild msbuild-task

我有以下简单任务:

<Exec Command="  icacls   &quot;$( [System.IO.Path]::Combine( $(_tempPublishUrl), Logs              ))&quot;  /grant      Users:(CI)(OI)M  /T  "  ContinueOnError="true" />
<Exec Command="  icacls   &quot;$( [System.IO.Path]::Combine( $(_tempPublishUrl), Logs              ))&quot;  /grant  IIS_IUSRS:(CI)(OI)M  /T  "  ContinueOnError="true" />

<Exec Command="  icacls   &quot;$( [System.IO.Path]::Combine( $(_tempPublishUrl), ReportResults     ))&quot;  /grant      Users:(CI)(OI)M  /T  "  ContinueOnError="true" />
<Exec Command="  icacls   &quot;$( [System.IO.Path]::Combine( $(_tempPublishUrl), ReportResults     ))&quot;  /grant  IIS_IUSRS:(CI)(OI)M  /T  "  ContinueOnError="true" />

<Exec Command="  icacls   &quot;$( [System.IO.Path]::Combine( $(_tempPublishUrl), ReportTemplates   ))&quot;  /grant      Users:(CI)(OI)M  /T  "  ContinueOnError="true" />
<Exec Command="  icacls   &quot;$( [System.IO.Path]::Combine( $(_tempPublishUrl), ReportTemplates   ))&quot;  /grant  IIS_IUSRS:(CI)(OI)M  /T  "  ContinueOnError="true" />

我想创建一个可重用的任务,这些任务会将这些exec-task的参数“ _tempPublishUrl”参数化,因为我想在msbuild脚本的不同部分中重用它们(也就是消除代码重复)。我知道我可以像这样创建简单的C#任务:

<UsingTask
  TaskName="RenameDirectory"
  TaskFactory="CodeTaskFactory"
  AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"
>
  <ParameterGroup>
    <PathToDirToRename          ParameterType="System.String"    Required="true" />
    <PathToNewDirectoryName     ParameterType="System.String"    Required="true" />
  </ParameterGroup>

  <Task>
    <Reference  Include="System.Core" />
    <Using Namespace="System" />

    <Code Type="Fragment" Language="cs">
      <![CDATA[
          System.IO.Directory.Move(PathToDirToRename, PathToNewDirectoryName);
      ]]>
    </Code>
  </Task>
</UsingTask>

但是如何使用对我的任务进行分组,以创建可重复使用的任务(考虑功能)?我找不到一个展示这种情况的示例。

3 个答案:

答案 0 :(得分:0)

据我了解,您可以将Exec与参数组合成Target并使用CallTarget

答案 1 :(得分:0)

  

我想创建一个可重用的任务,这些任务将这些exec-task的参数“ _tempPublishUrl”参数化,因为我想在msbuild脚本的不同部分中重复使用它们(又称消除代码重复)。

作为一种解决方法,您可以在_tempPublishUrl / .targets文件中定义.props,例如:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <_tempPublishUrl>SomeValue1</_tempPublishUrl>
  </PropertyGroup>
</Project>

然后,当您在msbuild脚本的不同部分中重新使用它们时,可以导入此.targets / .props文件:

<Import Project="..\Path\xxxx.targets" />

即使您可以使用nuget来管理此文件,也无需手动导入此.targets / .props文件,只需将nuget包添加到msbuild脚本的不同部分,请查看Creating native packages了解更多详细信息。

此外,您还可以在<UsingTask> / .targets文件中添加.props。在这种情况下,我们不需要重复<UsingTask>代码,可以在导入.targets / .props文件或安装nuget包后重新使用它。

希望这会有所帮助。

答案 2 :(得分:0)

就我的研究而言,获得所需效果的唯一方法是将所需功能提取到单独的.msbuild文件中,并在调用上述卫星.msbuild时使用任务的Properties =“ ...”属性文件。这种方法是不理想的,因为卫星.msbuild仍通过“ / p”开关在根.msbuild文件传递的全局属性中公开。但这足够接近理想,肯定比没有好。