我有一个应用程序,可以有 3 种“风格”之一,风格仅取决于项目中引用的 NuGet 包。 为了简化构建,我想使用自定义属性来定义风味,然后在包引用上使用条件。 应该可以使用 Visual Studio 或使用 MSBuild CommandLine 构建应用程序。 我将其添加到 PropertyGroup 中:
<Flavor Condition= "'$(Flavor)'==''">Flavor1</Flavor>
我可以看到自定义属性设置正确,只是条件被忽略 这是我尝试过的:
只有#3 有效并且仅在 Visual Studio 中有效 我需要一个可以在 Visual Studio 和 MSBuild 命令行中运行的解决方案
#1 看起来像这样:
<PackageReference Include="Falvor1Package" Condition="'$(Flavor)'=='Flavor1'">
<Version>1.1.1.1</Version>
</PackageReference>
<PackageReference Include="Falvor2Package" Condition="'$(Flavor)'=='Flavor2'">
<Version>1.1.1.1</Version>
</PackageReference>
#2 看起来像这样:
<ItemGroup Condition="'$(Flavor)'=='Flavor1'">
<PackageReference Include="Falvor1Package">
<Version>1.1.1.1</Version>
</PackageReference>
</ItemGroup>
<ItemGroup Condition="'$(Flavor)'=='Flavor2'">
<PackageReference Include="Falvor2Package">
<Version>1.1.1.1</Version>
</PackageReference>
</ItemGroup>
#3 看起来像这样:
<Choose>
<When Condition="'$(Flavor)'=='Flavor1'">
<ItemGroup>
<PackageReference Include="Falvor1Package">
<Version>1.1.1.1</Version>
</PackageReference>
</ItemGroup>
</When>
</Choose>
<Choose>
<When Condition="'$(Flavor)'=='Flavor2'">
<ItemGroup>
<PackageReference Include="Falvor2Package">
<Version>1.1.1.1</Version>
</PackageReference>
</ItemGroup>
</When>
</Choose>
我正在使用 VS2019 和 MSBuild 16 我错过了什么?
据我所知,这是行不通的。您不能在
PackageReference
上使用任意条件(属性)。另请参阅此:
您可以使用条件来控制是否包含某个包, 其中条件可以使用任何 MSBuild 变量或中定义的变量 目标或 props 文件。但目前,只有 支持 TargetFramework 变量。
换句话说,您可以执行类似的操作,但不使用自定义属性:
<ItemGroup>
<PackageReference Include="..." Version="..." Condition="'$(TargetFramework)' == '...'" />
</ItemGroup>
TargetFramework 的值必须是有效的 TFM。
将条件添加到封闭的
ItemGroup
元素时同样适用。
猜测: 我猜原因是,当在这里支持任意条件时,Visual Studio 不能很好地发挥作用。因为最终,它知道引用了哪些 nuget 包(最终是程序集)。通过更改 Visual Studio 内的相应设置来更改
TargetFramework
值,因此它可以(手动)处理该问题,并相应地调整引用的包。对于任意的东西来说很难做到这一点。
但这一切都只是猜测,可能是完全错误的。
我认为这是 VS IDE nuget Restore 上的问题。并且问题是针对非sdk net Framework项目的PackageReference nuget管理格式。但是,问题不在于 new-sdk 项目。
我已经多次测试了该问题,VS IDE nuget Restore 将忽略该情况。毫无疑问,这是一个问题。
所以我建议您可以向团队报告问题。
但是、
nuget restore
和msbuild restore
可以指定non-sdk
项目上的条件。所以问题是 msbuild restore
、nuget restore
和 VS IDE Restore
之间的区别。
所以作为建议,你可以对VS2019的项目做一些改变:
右键单击 Project Properties-->Build Event--> 将其添加到 Pre-build event 命令行:
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" -t:restore $(ProjectDir)
并且然后你就可以在 VS2019 上构建你的项目了,没有任何问题。
这就是我实现它的方法:
<Choose>
<When Condition=" '$(Configuration)'=='Release' ">
<ItemGroup>
<PackageReference Include="Volo.Abp.Autofac" Version="7.3.2" />
<PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="7.3.2" />
</ItemGroup>
</When>
<When Condition=" '$(Configuration)'=='Debug' ">
<ItemGroup>
<ProjectReference Include="..\..\abp\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\abp\framework\src\Volo.Abp.Caching.StackExchangeRedis\Volo.Abp.Caching.StackExchangeRedis.csproj" />
</ItemGroup>
</When>
</Choose>