Как я могу добавить событие AfterBuild в проект при установке моего пакета NuGet?

#powershell #nuget-package

#powershell #nuget-package

Вопрос:

У меня есть пакет nuget, который добавляет исполняемый файл, который мне нужно запускать после каждой сборки проекта.

Я могу добавить это вручную, добавив раздел в каждый файл проекта следующим образом:

 <Target Name="AfterBuild">
    <PropertyGroup>
      <PathToOutputExe>..binExecutable.exe</PathToOutputExe>
      <PathToOutputJs>"$(MSBuildProjectDirectory)ScriptsOutput.js"</PathToOutputJs>
      <DirectoryOfAssemblies>"$(MSBuildProjectDirectory)bin"</DirectoryOfAssemblies>
    </PropertyGroup>
    <AspNetCompiler Condition="'$(MvcBuildViews)'=='true'" VirtualPath="temp" PhysicalPath="$(ProjectDir)" />
    <Exec Command="$(PathToOutputExe) $(PathToOutputJs) $(DirectoryOfAssemblies)" />
  </Target>
  

Как я могу добавить это в проект при установке пакета nuget? (т. Е. используя объект DTE $ project в файле Install.ps1)

Я был бы очень признателен за любую помощь в этом.

Спасибо

Ричард

Ответ №1:

Начиная с NuGet 2.5, по соглашению, если вы добавляете файл targets на build{packageid}.targets (обратите внимание, что ‘build’ находится на том же уровне, что и content и tools), NuGet автоматически добавит импорт в файл targets в проекте. Тогда вам не нужно ничего обрабатывать в install.ps1. Импорт будет автоматически удален при удалении.

Кроме того, я думаю, что рекомендуемым способом сделать то, что вы хотите, было бы создать отдельную цель, настроенную для запуска после стандартной цели «Сборки»:

 <?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="NuGetCustomTarget" AfterTargets="Build">
        <PropertyGroup>
            <PathToOutputExe>..binExecutable.exe</PathToOutputExe>
            <PathToOutputJs>"$(MSBuildProjectDirectory)ScriptsOutput.js"</PathToOutputJs>
            <DirectoryOfAssemblies>"$(MSBuildProjectDirectory)bin"</DirectoryOfAssemblies>
        </PropertyGroup>
        <AspNetCompiler Condition="'$(MvcBuildViews)'=='true'" VirtualPath="temp" PhysicalPath="$(ProjectDir)" />
        <Exec Command="$(PathToOutputExe) $(PathToOutputJs) $(DirectoryOfAssemblies)" />
    </Target>
</Project>
  

Ответ №2:

Вот скрипт, который добавляет цель afterbuild. Он также использует NugetPowerTools, упомянутые выше.

 $project = Get-Project
$buildProject = Get-MSBuildProject

$target = $buildProject.Xml.AddTarget("MyCustomTarget")
$target.AfterTargets = "AfterBuild"
$task = $target.AddTask("Exec")
$task.SetParameter("Command", "`"PathToYourEXe`" $(TargetFileName)")
  

Сложной частью было правильное оформление кавычек. Вот как это выглядит в моем скрипте powertools.

Ответ №3:

Вы можете напрямую использовать MSBuild Api, как в этом сообщении в блоге.

 Add-Type -AssemblyName 'Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
$msbProject = [Microsoft.Build.Evaluation.ProjectCollection]::GlobalProjectCollection.GetLoadedProjects($project.FullName) | Select-Object -First 1
# use $msbProject to add/change AfterBuild target
  

Или вы могли бы использовать NugetPowerTools, который добавляет команду Powershell Get-MSBuildProject , чтобы сделать почти то же самое.

Кроме того, смотрите Это сообщение на форуме для получения более подробной информации о добавлении нового целевого объекта.