使用MSBuild批量构建多解决方案并输出至独立目录的问题
解决MSBuild批量构建控制台应用并定向输出到指定目录的问题
你的需求很明确:批量构建80个控制台应用,最终把每个应用的Release产物放到c:\builds\App1、c:\builds\App2这样的独立目录里。先看看你现有脚本的几个核心问题:
- 路径匹配错误:
MyReleaseFiles用的是脚本所在目录的.\bin\release,但每个解决方案的项目输出其实在各自项目文件夹的bin\Release下,所以根本找不到要复制的文件。 - 属性未传递:你在PropertyGroup里设置的
OutputPath和OutDir没有传递给每个被构建的解决方案,MSBuild任务默认不会自动继承这些全局属性。 - 未定义变量:
$(AssemblyName)在这个顶层脚本里是没有定义的,因为它是项目文件的内置属性,顶层脚本无法直接获取,导致输出路径无效。
下面是修正后的完整脚本,我会逐一解释关键修改点:
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration> <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <!-- 定义根输出目录 --> <RootOutputDir>c:\builds\</RootOutputDir> </PropertyGroup> <ItemGroup> <!-- 收集所有解决方案 --> <Solution Include="./**/*.sln" /> </ItemGroup> <Target Name="Build"> <!-- 批量构建每个解决方案,传递输出目录属性 --> <MSBuild Projects="@(Solution)" BuildInParallel="true" Targets="Build" Properties=" Configuration=$(Configuration); Platform=$(Platform); <!-- 动态设置每个项目的输出目录:根目录 + 项目的AssemblyName --> OutDir=$(RootOutputDir)$(AssemblyName)\; OutputPath=$(RootOutputDir)$(AssemblyName)\; <!-- 禁用vshost文件生成,避免额外文件 --> GenerateVSHostProxy=false " /> </Target> </Project>
关键修改说明:
- 直接定向输出,无需事后复制:通过在
MSBuild任务的Properties参数里传递OutDir和OutputPath,让每个项目直接把构建产物输出到c:\builds\{AssemblyName}\目录下,省去了后续复制文件的步骤,更高效。 - 传递属性到子项目:把配置、平台和输出目录属性明确传递给每个被构建的解决方案,确保子项目能正确接收这些设置。
- 禁用vshost文件:添加
GenerateVSHostProxy=false,避免生成调试用的*vshost.exe文件,让输出目录更干净。 - 去掉无效的文件收集:删除了原来的
MyReleaseFiles和Copy步骤,因为现在直接定向输出,不需要再复制。
如果你的某些解决方案包含多个项目,而你只想输出控制台项目的产物,可以进一步过滤项目类型,比如只包含控制台项目:
<ItemGroup> <!-- 只收集控制台项目文件,替代解决方案的方式 --> <ConsoleProject Include="./**/*.csproj" Condition="Exists('%(FullPath)')"> <AdditionalProperties>Configuration=$(Configuration);Platform=$(Platform);OutDir=$(RootOutputDir)$(AssemblyName)\;OutputPath=$(RootOutputDir)$(AssemblyName)\;GenerateVSHostProxy=false</AdditionalProperties> </ConsoleProject> </ItemGroup> <Target Name="Build"> <MSBuild Projects="@(ConsoleProject)" BuildInParallel="true" Targets="Build" Properties="%(ConsoleProject.AdditionalProperties)" /> </Target>
这样就能精准控制只构建控制台项目,输出到指定目录了。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

