Как запускать события пост-сборки Visual Studio только для отладочной сборки
Как я могу ограничить запуск событий после сборки только для одного типа сборки? Я использую события для копирования библиотек DLL в локальный виртуальный каталог IIS, но я не хочу, чтобы это происходило на сервере сборки в режиме выпуска.
12 ответов
События до и после сборки запускаются как пакетный скрипт. Вы можете сделать условное заявление на $(ConfigurationName)
,
Например
if $(ConfigurationName) == Debug xcopy something somewhere
К вашему сведению, вам не нужно использовать goto. команда оболочки IF может использоваться с круглыми скобками:
if $(ConfigurationName) == Debug (
copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
echo "why, Microsoft, why".
)
Добавьте ваше событие пост сборки, как обычно. Затем сохраните ваш проект, откройте его в блокноте (или в вашем любимом редакторе) и добавьте условие в группу свойств PostBuildEvent. Вот пример:
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>
В качестве альтернативы (поскольку события помещаются в пакетный файл и затем вызываются), используйте следующее. (в окне событий Build, а не в пакетном файле):
if $(ConfigurationName) == Debug goto :debug
:release
signtool.exe ....
xcopy ...
goto :exit
:debug
' debug items in here
:exit
Таким образом, вы можете иметь события для любой конфигурации и по-прежнему управлять ими с помощью макросов, а не передавать их в пакетный файл и помнить, что%1 - это $(OutputPath) и т. Д.
Начиная с Visual Studio 2019, современные .csproj
формат поддерживает добавление условия непосредственно в Target
элемент:
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
<Exec Command="nswag run nswag.json" />
</Target>
Пользовательский интерфейс не позволяет настроить это, но, похоже, он безопасно оставляет Configuration
атрибут на месте, если вы вносите изменения через пользовательский интерфейс.
Visual studio 2015: правильный синтаксис (оставьте его в одной строке):
if "$(ConfigurationName)"=="My Debug CFG"
( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y)
else
( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)
Нет ошибки 255 здесь.
Вы можете передать имя конфигурации скрипту после сборки и проверить его там, чтобы увидеть, должен ли он работать.
Передайте имя конфигурации с помощью $(ConfigurationName)
Проверка основана на том, как вы реализуете шаг после сборки - это будет аргумент командной строки
Что касается VS 2022, я нашел 2 решения. В моем конкретном случае я хочу упаковать в другой каталог в зависимости отConfiguration
.
Опция 1
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Command="if $(Configuration) == Debug (dotnet pack --no-build -o ~/../../../../../nuget-repo/debug -p:PackageVersion=$(VersionInfo)) else (dotnet pack --no-build -o ~/../../../../../nuget-repo -p:PackageVersion=$(VersionInfo))" />
</Target>
Вариант 2
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Exec Condition="'$(Configuration)' == 'Debug'" Command="dotnet pack --no-build -o ~/../../../../../nuget-repo/debug -p:PackageVersion=$(VersionInfo)" />
<Exec Condition="'$(Configuration)' == 'Release'" Command="dotnet pack --no-build -o ~/../../../../../nuget-repo -p:PackageVersion=$(VersionInfo)" />
</Target>
Я предпочитаю вариант 2 .
Я обнаружил, что могу поместить несколько условий в файл проекта следующим образом:
<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition=" '$(Configuration)' != 'Debug' AND '$(Configuration)' != 'Release' ">
<Exec Command="powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File $(ProjectDir)postBuild.ps1 -ProjectPath $(ProjectPath) -Build $(Configuration)" />
</Target>
Это работает для меня в Visual Studio 2015.
Я копирую все dll-файлы из папки, расположенной в папке lib на том же уровне, что и папка моего решения, в целевой каталог создаваемого проекта.
Используя относительный путь из моего каталога проекта и пройдя два шага вверх по структуре папок с помощью.. \.. \ lib
MySolutionFolder
....Мой проект
Lib
if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")
Как и для любого проекта, настройки можно настроить для каждой конфигурации, просто выберите конфигурацию, которую вы хотите изменить, в раскрывающемся списке диалоговых окон страниц свойств и отредактируйте шаг после сборки.
В VS 2012 вы должны использовать (я думаю, в VS 2010 тоже)
if $(Configuration) == Debug xcopy
$ (ConfigurationName) был указан как макрос, но не был назначен.
Сравните: http://msdn.microsoft.com/en-us/library/c02as0cs%28v=vs.110%29.aspx