У меня есть решение С# 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, а также жестко закодировать папку конфигурации (отладка или Развертывать).