#visual-studio #copy #project #post-build-event #project-files
#visual-studio #Копировать #проект #событие после сборки #проекты и решения
Вопрос:
У меня есть решение C # Visual Studio примерно с 15 проектами. Когда я создаю решение, я хочу, чтобы все DLL- и EXE-файлы для каждого проекта отправлялись в общую папку (называемую Deploy).
Я думал об этом так: для раздела командной строки каждого проекта после события сборки поместите следующие команды:
IF NOT EXIST $(SolutionDir)Deploy (
'If directory does not exist, create it
MKDIR $(SolutionDir)Deploy
) ELSE (
'Delete directory to make sure it's "clean"
RMDIR /F /S /Q $(SolutionDir)Deploy
MKDIR $(SolutionDir)Deploy
)
'Copy executable and required DLLs to Deploy directory
COPY /Y $(TargetPath) $(SolutionDir)Deploy
COPY /Y $(TargetDir)*.dll $(SolutionDir)Deploy
Проблема с выполнением этого таким образом, однако, заключается в том, что у меня есть 15 проектов, и я поместил бы это в раздел событий после сборки каждого отдельного проекта, а также, каждый раз, когда я добавляю новый проект, я должен был бы помнить, что нужно делать то же самое для него.
Я проверил свойства файла решения и не увидел способа установить событие post build для копирования всех файлов в масштабе всего решения, поэтому я выполнил несколько поисковых запросов в Google.
На одной странице говорилось, что используется проект C Makefile. Я добавил этот тип проекта в свое решение и, перейдя на страницу свойств проекта, обнаружил, что в разделе Свойства конфигурации-> NMake есть раздел со следующим:
- Командная строка сборки
- Перестроить всю командную строку
- Очистить командную строку
Использование опции командной строки проекта Makefile создает проблему, аналогичную описанной выше. Множество различных команд для копирования каждого из выходных файлов моего 15 проекта, таких как:
COPY /Y $(SolutionDir)Project1bin$(ConfigurationName)*.exe $(SolutionDir)Deploy
COPY /Y $(SolutionDir)Project2bin$(ConfigurationName)*.exe $(SolutionDir)Deploy
...
COPY /Y $(SolutionDir)Project15bin$(ConfigurationName)*.exe $(SolutionDir)Deploy
Существует еще одна очевидная проблема с выполнением этого таким образом. Как вы можете видеть, я воспользовался макросами $ (SolutionDir) и $ (ConfigurationName), но мне пришлось жестко прописать название каждого проекта.
Я не видел никаких макросов, таких как $ (AllProjects), $ (AllProjectDirs) и т.д.
Кроме того, похоже, что команды командной строки для проектов Makefile предназначены для сборки, а не для событий после сборки, поэтому я вообще отказался от этой идеи.
Затем я попытался использовать проект Visual Studio Installer. После добавления проекта в мое решение я щелкнул правой кнопкой мыши по проекту и увидел, что там была опция Добавить-> Вывод проекта …. Это вызвало диалоговое окно, позволяющее мне добавить один из основных выходных данных моего другого проекта. Я повторил это для каждого из моих других проектов и перестроил.
Результатом стал файл .MSI в выходной папке. Затем я открыл свойства проекта установщика и изменил параметр Package files на Как свободные несжатые файлы и перестроил. Выходная папка теперь содержала все EXE- и DLL-файлы моего проекта!
Большинство людей были бы удовлетворены на этом этапе и двигались бы дальше, но я из тех людей, которым нравится находить наилучший способ выполнения задач.
Была одна вещь, которая мне не понравилась в использовании опции проекта установщика, тот факт, что, помимо копирования файлов из всех моих проектов, он также создал MSI-файл (который мне не нужен), и я не видел никакой опции, указывающей ему не создавать его.
Кто-нибудь может порекомендовать другой / лучший способ достичь моей цели копирования всех выходных файлов проекта в одну папку?
Спасибо.
PS Я думал, что мог бы просто создать пакетный файл для поиска и копирования всех EXE- и DLL-файлов в папку Deploy, но мне пришлось бы запускать пакетный файл вне среды разработки Visual Studio IDE, а также жестко запрограммировать папку конфигурации (Debug или Deploy).
Ответ №1:
Разве вы не можете просто изменить выходной каталог проектов на C ? Смотрите, Как это сделать: Измените выходной каталог сборки.
- В строке меню выберите Проект, Свойства.
- Разверните узел Свойства конфигурации и выберите Общие.
- Измените значение выходного каталога на новый выходной каталог.
Если вам нужны оба варианта, вы также можете создать несколько конфигураций для своих проектов и решений VS, аналогичных стандартным «Debug» и «Release». Создайте новую конфигурацию из одной из существующих, затем измените выходной каталог и сохраните. Теперь вы можете просто переключить конфигурацию на уровне решения для сборки в другой каталог. Смотрите эту ссылку для подробных действий:
Комментарии:
1. Спасибо за предложение! Я кратко подумал об этом, но мне также нравится идея перехода сборки каждого проекта в их собственную независимую папку вывода. Я изучу предложенную вами ссылку и прочитаю больше. Может быть вариант, при котором сборка каждого проекта будет отправляться в несколько папок (по умолчанию и в общую папку).
2. Еще раз спасибо за ответ! Ваше решение работает, однако у него есть проблема, аналогичная использованию пользовательских шагов post build для каждого проекта. Для этого требуется, чтобы я настроил каждый отдельный проект. Я понимаю, что это было бы то, что мне пришлось бы сделать только один раз, но, как я уже говорил в своем первоначальном сообщении, я хотел бы найти «лучший» или «самый простой» способ сделать это, и необходимость изменять настройки только одного проекта, а не всех из них, кажется мне более привлекательной.
3. Я думаю, что собираюсь просто оставить все так, как у меня есть в настоящее время. Проект установщика, который копирует файлы и просто игнорирует генерируемый MSI-файл. Спасибо. 🙂