我有一个包含30多个项目的Visual Studio解决方案。有2种构建配置,Debug和Release。使用外部工具可以合理地生成十个项目文件( .csproj ),并且该代的模板包括Debug和Release配置。修改模板以包含其他配置实际上不是一种选择。
所以我遇到的问题是我有一个在AppFabric / IIS中托管的新项目。我正在使用Web.Config转换来更新Web.Config,以便部署到4种不同的环境:开发,测试,分段,生产。我使用Configuration Manager将这些上下文添加到特定项目中。这样做,所以我可以更新配置管理器,例如发布版本以使用项目的生产上下文。右键单击并为项目构建部署包会导致适当的转换应用于Web.Config。
现在我想自动化这个过程,所以我有一个MSBuild脚本:
<ItemGroup>
<BuildMode Include="Dev"/>
<BuildMode Include="Test"/>
<BuildMode Include="Staging"/>
<BuildMode Include="Prod"/>
</ItemGroup>
<Target Name="Build" DependsOnTargets="Package"></Target>
<!--
Build deployment package for each target environment
-->
<Target Name="Package" Outputs="%(BuildMode.Identity)">
<Message Text="Building %(BuildMode.Identity)"/>
<MSBuild Projects="..\SynchWorkflow\SynchWorkflow.csproj"
Targets="Package"
Properties="Platform=AnyCPU;Configuration=%(BuildMode.Identity);"/>
</Target>
不幸的是,这个错误是因为它试图构建,例如当 Prod 配置不存在时, Prod 只是SynchWorkflow项目的上下文。我想要做的是使用 Release 配置生成 Prod 上下文包。是否可以使用 MSBuild 任务?我可以在属性属性中为 MSBuild 任务提供额外的设置吗?
答案 0 :(得分:3)
我为每个环境添加了新的解决方案配置(无需添加新的项目配置),然后使用Configuration Manager将依赖项目的上下文设置为 Release 。不幸的是,这不起作用,因为MSBuild任务是针对项目文件而不是解决方案构建的。已使用Julien Hoarau's SO answer解决。添加新的解决方案配置是正确的方法,但链接的答案为我关闭了循环。构建脚本已更新为以下内容:
<ItemGroup>
<BuildMode Include="Development"/>
<BuildMode Include="Test"/>
<BuildMode Include="Staging"/>
<BuildMode Include="Production"/>
</ItemGroup>
<PropertyGroup>
<PackageLocation>$(MSBuildProjectDirectory)</PackageLocation>
</PropertyGroup>
<Target Name="Build" DependsOnTargets="Package"></Target>
<!--
Build deployment package for each target environment
-->
<Target Name="Package" Outputs="%(BuildMode.Identity)">
<Message Text="Building %(BuildMode.Identity)"/>
<MSBuild Projects="..\SynchWorkflow.sln"
Properties="Platform=Any CPU;
Configuration=%(BuildMode.Identity);
DeployOnBuild=true;
DeployTarget=Package;
PackageLocation=$(PackageLocation)\SynchWorkflow.%(BuildMode.Identity)Package.zip;"/>
</Target>
该脚本针对解决方案文件构建,并为每个目标环境生成正确的包。出于示例脚本的目的,我正在 MSBuildProjectDirectory 中创建包,这有点不是最理想的。