我有一个应用程序,可以在3个“风味”之一,风味只取决于项目中引用的NuGet包。为了简化构建,我想使用一个自定义属性来定义风格,然后在包引用上使用条件。应该可以使用Visual Studio或MSBuild命令行构建应用程序。我把这个添加到了属性组中:
<Flavor Condition= "'$(Flavor)'==''">Flavor1</Flavor>
我可以看到自定义属性被正确设置,只是条件被忽略了。
1.在PackageReference本身上设置条件,如下所述:https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference-condition
1.将有条件的包放在单独的ItemGroup中并在那里设置条件
1.与#2相同,但带有Choose+When
只有#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,我缺少什么?
3条答案
按热度按时间wtzytmuj1#
阿法伊,那不管用。不能在
PackageReference
上使用任意条件(属性)。还可以看到:您可以使用条件来控制是否包含包,其中条件可以使用任何MSBuild变量或在目标或props文件中定义的变量。但是,目前仅支持TargetFramework变量。
换句话说,你可以这样做,但不使用自定义属性:
其中,TargetFramework的值必须是有效的TFM。
这同样适用于将条件添加到/a封闭
ItemGroup
元素时。TargetFramework
的值是通过在Visual Studio中更改相应的设置来更改的,因此它可以(手动)科普,相应地调整引用的包。对于任意的东西,这将是很难做到的。但这一切都只是猜测,可能完全错误。bihw5rsg2#
我认为这是VS IDE nuget Restore上的问题。而这个问题是针对非sdk net framework项目的PackageReferencenuget管理格式。然而,这个问题并不适用于new-sdk项目。
我已经多次测试这个问题,VS IDE nuget restore会忽略这个条件。这无疑是一个问题。
所以我建议你可以向团队报告这个问题。
I have raised the issue on Github.
但是,
nuget restore
和msbuild restore
可以指定non-sdk
项目上的条件。所以问题是msbuild restore
,nuget restore
和VS IDE Restore
之间的区别。因此,作为建议,您可以对VS 2019的项目进行一些更改:
右键单击项目属性->构建事件->在预构建事件命令行中添加以下内容:
然后您就可以在VS 2019上构建您的项目,没有任何问题。
20jt8wwn3#
我是这样做到的: