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

У меня есть решение С# 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 проектов, и я бы поместил это в раздел событий после сборки каждого отдельного проекта, а также каждый раз, когда я добавляю новый проект, я должен был бы не забыть сделать то же самое для него. .

Я проверил свойства файла решения и не нашел способа установить событие после сборки для всего решения, чтобы скопировать все файлы, поэтому я сделал несколько поисков в Google.

На одной странице говорилось, что используется проект C++ Makefile. Я добавил этот тип проекта в свое решение, щелкнул страницу свойств проекта и обнаружил, что в разделе Свойства конфигурации->NMake есть раздел со следующим:

  • Командная строка сборки
  • Перестроить всю командную строку
  • Чистая командная строка

Использование параметра командной строки проекта Makefile создает проблему, аналогичную описанной выше. Множество различных команд для копирования каждого из 15 выходных файлов моего проекта, например:

COPY /Y $(SolutionDir)Project1\bin\$(ConfigurationName)\*.exe $(SolutionDir)Deploy
COPY /Y $(SolutionDir)Project2\bin\$(ConfigurationName)\*.exe $(SolutionDir)Deploy
...
COPY /Y $(SolutionDir)Project15\bin\$(ConfigurationName)\*.exe $(SolutionDir)Deploy

Есть еще одна очевидная проблема с этим способом. Как видите, я воспользовался преимуществами макросов $(SolutionDir) и $(ConfigurationName), но мне пришлось жестко запрограммировать имя каждого проекта. Я не видел макросов типа $(AllProjects), $(AllProjectDirs) и т.д.

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

Затем я попытался использовать проект Visual Studio Installer. После добавления проекта в свое решение я щелкнул проект правой кнопкой мыши и увидел, что есть опция Add->Project Output.... Это вызвало диалоговое окно, позволяющее мне добавить один из основных выходных данных моего другого проекта. Я повторил это для каждого из моих других проектов и перестроил.

В результате в выходной папке появился файл .MSI. Затем я открыл свойства проекта установщика и изменил параметр Файлы пакета на Как несжатые файлы и пересобрал. Выходная папка теперь содержала все файлы EXE и DLL моего проекта!

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

Была одна вещь, которая мне не нравилась в использовании опции проекта установщика, тот факт, что, помимо копирования файлов из всех моих проектов, он также создал файл MSI (который мне не нужен), и я не видел никаких опция скажите ему не создавать его.

Может ли кто-нибудь порекомендовать другой/лучший способ выполнить мою задачу по копированию всех выходных файлов проекта в одну папку?

Спасибо.

P.S. Я думал, что мог бы просто создать пакетный файл для поиска и копирования всех файлов EXE и DLL в папку Deploy, но мне пришлось бы запускать пакетный файл вне Visual Studio IDE, а также жестко закодировать папку конфигурации (отладка или Развертывать).


person Jan Tacci    schedule 04.07.2014    source источник


Ответы (1)


Разве вы не можете просто изменить каталог вывода проектов C++? См. Как изменить выходной каталог сборки.

  • В строке меню выберите «Проект», «Свойства».
  • Разверните узел «Свойства конфигурации» и выберите «Общие».
  • Измените значение выходного каталога на новый выходной каталог.

Если вам нужны оба варианта, вы также можете создать несколько конфигураций для своих проектов и решений VS, аналогичных стандартным «Отладка» и «Выпуск». Создайте новую конфигурацию из одной из существующих, затем измените выходной каталог и сохраните. Теперь вы можете просто переключить конфигурацию на уровне решения, чтобы встроить ее в другой каталог. Подробные шаги смотрите по этой ссылке:

Как создавать и редактировать конфигурации

person metacubed    schedule 04.07.2014
comment
Спасибо за предложение! Я ненадолго подумал об этом, но мне также нравится идея, что сборка каждого проекта помещается в свою собственную независимую выходную папку. Я изучу ссылку, которую вы предлагаете, и прочитаю больше. Может быть возможность, чтобы сборка каждого проекта помещалась более чем в одну папку (по умолчанию и общую папку). - person Jan Tacci; 04.07.2014
comment
Еще раз спасибо за ответ! Ваше решение работает, однако проблема аналогична использованию настраиваемых шагов после сборки для каждого проекта. Это требует, чтобы я настроил каждый отдельный проект. Я понимаю, что это будет то, что мне нужно будет сделать только один раз, но, как я уже говорил в своем исходном посте, я хотел бы найти лучший или самый простой способ сделать это и изменить настройки только одного проекта, а не всех. они кажутся мне более привлекательными. - person Jan Tacci; 04.07.2014
comment
Думаю, я просто оставлю вещи такими, какие они у меня есть сейчас. Проект установщика, который копирует файлы и просто игнорирует сгенерированный файл MSI. Спасибо. :) - person Jan Tacci; 04.07.2014