#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
, чтобы сделать почти то же самое.
Кроме того, смотрите Это сообщение на форуме для получения более подробной информации о добавлении нового целевого объекта.