Как запускать события пост-сборки 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

Другие вопросы по тегам