我有一个包含大约 15 个项目的 C# Visual Studio 解决方案。当我构建解决方案时,我希望每个项目的所有 DLL 和 EXE 文件都转到一个公共文件夹(称为 Deploy)。
我正在考虑这样做的方式是,对于每个项目的Post-build Event Command Line部分放置以下命令:
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项目。我将这种类型的项目添加到我的解决方案中,然后单击项目属性页面,发现在Configuration Properties->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 安装程序项目。将项目添加到我的解决方案后,我右键单击该项目并看到有一个Add->Project Output...选项。这带来了一个对话框,允许我添加我的另一个项目的主要输出之一之一。我对我的其他每个项目都重复了这一点并进行了重建。
结果是输出文件夹中的 .MSI 文件。然后我打开安装程序项目属性并将包文件选项更改为松散未压缩文件并重新构建。输出文件夹现在包含我项目的所有 EXE 和 DLL 文件!
大多数人会在这一点上感到满意并继续前进,但我是那种喜欢找到最好的做事方式的人。
我不喜欢使用安装程序项目选项的一件事,事实上,除了从我的所有项目中复制文件之外,它还创建了一个 MSI 文件(我不需要)而且我没有看到任何选项告诉它不要创建一个。
谁能推荐另一种/更好的方法来实现我将所有项目输出文件复制到单个文件夹的目标?
谢谢你。
PS 我在想我可以只制作一个批处理文件来搜索所有 EXE 和 DLL 文件并将其复制到 Deploy 文件夹,但我必须在 Visual Studio IDE 之外运行批处理文件并硬编码配置文件夹(调试或部署)。