Выполнение команд POST_BUILD на основе файловых зависимостей

У меня есть шаг DLL POST_BUILD, который копирует DLL в каталог A. Предположим, я затем удаляю файл из каталога A. Затем я нажимаю F5 в Visual Studio, и файл не копируется.

Какие у меня варианты здесь? Как мне указать, что существует набор операций, которые должны выполняться как каждый раз, когда DLL-библиотека связана, и когда файл в каталоге A устарел (или отсутствует)?

РЕДАКТИРОВАТЬ: Это, в частности, неуправляемый проект C++, и имеет только файлы.vcproj, созданные CMake. Поэтому редактирование.vcproj не практично в моем рабочем процессе.

2 ответа

Решение

Команды после сборки выполняются только тогда, когда msbuild определяет, что проект должен быть перестроен. В противном случае он не знает, что ваш проект зависит от этого файла, так как он не анализирует команды после сборки, что нецелесообразно.

Безусловно, самое простое решение - просто не удалять этот файл, в этом нет особого смысла. Еще один способ сделать msbuild более умным - добавить файл в ваш проект. Используйте проект + Добавить существующий элемент. Установите Build action = Content, Copy to Output Directory = Copy, если новее. Конечно, это немного забивает дерево вашего проекта.

Подход Ганса тоже хорош.

Вместо того, чтобы использовать хуки IDE, вам лучше редактировать проект напрямую, так как msbuild предоставляет полный набор задач для выполнения того, что вы хотите.

Если вы отредактируете файл.csproj (щелкните правой кнопкой мыши -> выгрузить проект -> изменить) и добавите шаг после сборки, вы получите желаемое поведение грязного копирования:

<Target Name="AfterBuild">
  <ItemGroup>
    <BuildArtifacts Include="MyDll.dll"/>
    <FileWrites Include="$(DestDir)\*.*" />
  </ItemGroup>
  <Copy SourceFiles="@(BuildArtifacts)" DestinationFiles="->'$(DestDir)\%(Filename)%(Extension)'" />
</Target>
Другие вопросы по тегам