Лучший способ скопировать все EXE-и DLL-файлы проектов из решения в одну общую папку?

#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-файл. Спасибо. 🙂