MSBuild: Как создать параметризованное inline-задание, содержащее несколько <Exec>задач - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть следующие простые задачи:

<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" />

Я хочу создать повторно используемую задачу, которая параметризует "_tempPublishUrl" этих exec-задач, потому что я хочу повторноиспользуйте их в разных частях скрипта 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 голосов
/ 24 сентября 2018

Я хочу создать повторно используемую задачу, которая параметризует "_tempPublishUrl" этих exec-задач, потому что я хочу повторно использовать их в разных частях сценария msbuild (он же устраняет дублирование кода).

В качестве обходного пути вы можете определить _tempPublishUrl в файле .targets / .props, например:

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

Затем вы можете импортировать этот .targets / *Файл 1012 *, когда вы повторно используете их в разных частях скрипта msbuild:

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

Даже вы можете использовать nuget для управления этим файлом, поэтому нам не нужно импортировать этот .targets / .props файл вручную, просто добавьте пакет nuget в разные части скрипта msbuild, проверьте Создание собственных пакетов для получения дополнительной информации.

Кроме того, вы также можете добавить <UsingTask> в файле .targets / .props.В этом случае нам не нужно повторять код <UsingTask>, мы могли бы использовать его повторно после импорта файла .targets / .props или установки пакета nuget.

Надеюсь, это поможет.

0 голосов
/ 31 октября 2018

Поскольку мое исследование пошло только на то, чтобы достичь желаемого эффекта, это выделить нужные функции в отдельный файл .msbuild и использовать свойство Properties = "..." задачи при вызове вышеупомянутого спутника .msbuild.файл.Этот подход не идеален, поскольку спутниковый .msbuild все еще доступен глобальным свойствам, передаваемым в корневой файл .msbuild с помощью ключей "/ p".Но он достаточно близок к идеалу и, конечно, лучше, чем ничего.

0 голосов
/ 21 сентября 2018

Насколько я понимаю, вы можете объединить Exec в Target с параметрами и использовать CallTarget .

...