Как я могу добавить событие AfterBuild в проект при установке моего пакета NuGet? - PullRequest
5 голосов
/ 11 ноября 2011

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

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

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

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

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

Спасибо

Ричард

Ответы [ 3 ]

5 голосов
/ 27 августа 2014

Начиная с NuGet 2.5 , по соглашению, если вы добавляете целевой файл в build\{packageid}.targets (обратите внимание, что "build" находится на том же уровне, что и содержимое и инструменты), 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>..\bin\Executable.exe</PathToOutputExe>
            <PathToOutputJs>"$(MSBuildProjectDirectory)\Scripts\Output.js"</PathToOutputJs>
            <DirectoryOfAssemblies>"$(MSBuildProjectDirectory)\bin\"</DirectoryOfAssemblies>
        </PropertyGroup>
        <AspNetCompiler Condition="'$(MvcBuildViews)'=='true'" VirtualPath="temp" PhysicalPath="$(ProjectDir)" />
        <Exec Command="$(PathToOutputExe) $(PathToOutputJs) $(DirectoryOfAssemblies)" />
    </Target>
</Project>
3 голосов
/ 01 мая 2013

Вот скрипт, который добавляет цель после сборки. Он также использует 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.

1 голос
/ 08 мая 2012

Вы можете использовать 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сделать то же самое.

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

...