我有一个.NET Core 3项目,它引用了其他几个项目。我的主根项目具有Release-X
构建配置,但其他项目仅具有Release
配置,没有匹配的Release-X
配置。
当我尝试使用此发布我的主根项目时...
dotnet publish MyProject.csproj -c Release-X
...似乎为所有引用的项目使用了一些神秘的,不存在的默认构建配置。 (我可以知道,因为引用的项目在其构建配置的 all 中允许使用不安全的代码,但是使用上述命令进行构建会导致不安全的代码错误。)
我希望能够使用其Release-X
构建配置来构建我的主根项目,但要使用其Release
配置来构建所有引用的项目。我该怎么做?
答案 0 :(得分:1)
配置值设置为global property,该值将在整个项目图上强制执行,直到项目间引用显式更改此值为止。
有三种方法可以解决此问题,但请注意,由于NuGet还原逻辑的不同,从Visual Studio内部构建或从命令行构建.sln文件时,这可能会导致结果不一致(但是如果您选择您的csproj中没有Condition
依赖于$(Configuration)
的程序包或项目引用的属性)
为引用的项目设置显式配置(我建议使用此设置):
<Project Sdk="Microsoft.NET.Sdk">
....
<PropertyGroup>
<ReferencedConfiguration>$(Configuration)</ReferencedConfiguration>
<ReferencedConfiguration Condition="'$(Configuration)' == 'Release-X'>Release</ReferencedConfiguration>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\other\project.csproj" AdditionalProperties="Configuration=$(ReferencedConfiguration)" />
</ItemGroup>
</Project>
防止全局配置流过项目间引用。这不好,因为它将在目标项目中默认为“ Debug”,但这是一种可能的处理方式:
<Project Sdk="Microsoft.NET.Sdk">
...
<ItemGroup>
<ProjectReference Include="..\other\project.csproj" UndefineProperties ="Configuration" />
</ItemGroup>
</Project>
更改引用的项目,以便在设置后不将“配置”视为全局属性并将其覆盖。为了正确地影响依赖于此的所有逻辑,需要在导入SDK之前进行此操作:
<Project TreatAsLocalProperty="Configuration">
<PropertyGroup Condition="'$(Configuration)' != '' and '$(Configuration)' != 'Debug' and '$(Configuration)' != 'Release'>
<Configuration>Release</Configuration>
</PropertyGroup>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
.... (other project content)
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>