在同一个脚本中构建多种配置
我有一个解决方案文件(C#项目),它有若干个配置。每个配置设定了不同的目标框架(从 net48 到 net10.0-windows)。问题在于Visual Studio在我尝试批量构建时会与目标版本产生冲突。例如如果我的UI当前设置为 net8.0-windows,它会按该版本正常构建这些配置,但其他配置会失败。如果把UI切换到使用 net48 的配置,它会更新一段时间后在该版本上正确构建,但其他配置则失败,等等。我可以在VS中逐个单独构建,但似乎应该有更好的办法。
问题是,切换UI配置目标时VS在做什么,是否有办法用PowerShell脚本或其他方式把整件事脚本化。脚本的基本逻辑就是对每个配置执行以下步骤:
- 做好VS为该配置所做的准备工作
- 构建该配置
- 对下一个配置重复
这有可能吗?我已经尝试了相当多,但还没有任何成果。我现在使用 dotnet build 和 dotnet restore。
编辑
好吧,对不起,我想我说得够清楚了,但应该再多提供些细节。我有以下作为示例的.csproj文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Library</OutputType>
<RootNamespace>**My Root**</RootNamespace>
<AssemblyName>**My Assembly Name**</AssemblyName>
<Configurations>D2024;D2025;D2026;D2027;R2024;R2025;R2026;R2027</Configurations>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'R2027'">
<TargetFramework>net10.0-windows</TargetFramework>
<OutputPath>..\..\Build2027\</OutputPath>
<Optimize>true</Optimize>
</PropertyGroup>
...
其他配置与这里显示的2027配置类似,但 TargetFramework 和 OutputPath 的取值不同。我的应用是一个添加到父应用程序(Autodesk Revit)中的插件,我需要用同一个版本来支持父软件的多个版本(因此有不同的目标)。父应用决定.NET版本。正如前面所述,当我从say R2026(目标为 net8.0-windows)切换到R2027(目标为 net10.0-windows)时,VS会做一些事情,似乎是在切换它正在分析的平台,过了一会儿就会进入新平台并为该版本正确地构建。
我觉得无法使用多目标构建,因为那样所有版本都会尝试目标所有框架,结果行不通。
至于构建,下面是我写的非常基础的简单脚本:
for ($i = 2024; $i -le 2027; $i++){
"Building for Revit $i"
dotnet build ./*MySolution.sln --configuration R$i --no-incremental
}
我也尝试过让ChatGPT给出一个更好的版本(我在PowerShell方面还是初学者),它给出了一些在构建前使用 dotnet restore 的不同选项,但它们都在不同配置处遇到某种错误。再次说明,我对PowerShell不够熟悉,不知道是缺少什么,还是我在尝试做一些不可能的事……
解决方案
很可能是解决方案配置与项目配置映射存在问题——请使用“Configuration Manager”(配置管理器)查看映射并检查解决方案与UI项目配置之间的映射关系。
另外,确保相关项目在配置管理器中被设为要构建。