【问题标题】:Packaging web projects with MSBuild使用 MSBuild 打包 Web 项目
【发布时间】:2011-06-06 16:41:00
【问题描述】:
我有一个包含 5 个 Web 项目的解决方案并希望将它们打包,所以我在构建它之后运行 msbuild mysolution.sln /t:Package 并得到这个:
C:\mysolution.sln.metaproj:错误
MSB4057:目标“包”不
存在于项目中。
如果我一个一个地打包每个项目,一切都很好。这既愚蠢又不自然,我不想在我的 CI 流程中增加 5 个额外的步骤。 Package 目标有什么特别之处,以至于 MSBuild 无法像常规的 Build 或 Clean 那样执行它?什么是 *.sln.metaproj?
【问题讨论】:
标签:
.net
msbuild
build-process
【解决方案1】:
.sln.metaproj 文件由 MSBuild 在尝试构建解决方案文件时自动生成。创建此文件是因为解决方案文件不是 MSBuild 项目。在这个生成的文件中,自动创建了标准的 tarets Build、Clean 等,但不是 Package。您最好的选择可能是从使用解决方案文件切换到使用引用项目的 MSBuild 文件。它可能看起来像这样:
<Project ...>
<ItemGroup>
<Project Include="Project1.csproj" />
<Project Include="Project2.csproj" />
<Project Include="Project3.csproj" />
<Project Include="Project4.csproj" />
<Project Include="Project5.csproj" />
</ItemGroup>
<Target Name="Package">
<MSBuild
Projects="@(Project)"
Targets="Package"
Properties="Configuration=$(Configuration);Platform=$(Platform);..."
/>
</Target>
...etc. for Build, Clean etc.
</Project>
您还可以将一个名为“Package All”的存根“makefile 项目”添加到您的解决方案中,该解决方案直接在上述 msbuild 项目上调用 MSBuild。构建这个 makefile 项目将执行打包步骤。
仅供参考,要查看生成的元项目,请将名为 MSBuildEmitSolution 的环境变量设置为值“1”并运行构建,临时文件将被保留。
【解决方案2】:
在 TeamCity 中,我将命令行参数添加到构建 /p:IsPackaging=true