1

我有一个可以采用 3 种“风味”之一的应用程序,风味仅取决于项目中引用的 NuGet 包。为了简化构建,我想使用自定义属性来定义风味,然后在包引用上使用条件。应该可以使用 Visual Studio 或使用 MSBuild 命令行来构建应用程序。我将此添加到 PropertyGroup:

<Flavor Condition= "'$(Flavor)'==''">Flavor1</Flavor>

我可以看到自定义属性设置正确,只是忽略了条件这是我尝试过的:

  1. 如下所述设置 PackageReference 本身的条件:https ://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference-condition
  2. 将条件包放在单独的 ItemGroup 中并在那里设置条件
  3. 与 #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 我错过了什么?

4

2 回答 2

1

AFAIK,那行不通。您不能在 上使用任意条件(属性)PackageReference见:

您可以使用条件来控制是否包含包,其中条件可以使用任何 MSBuild 变量或在目标或道具文件中定义的变量。但是,目前仅支持 TargetFramework 变量。

换句话说,你可以做这样的事情,但不要使用你的自定义属性:

<ItemGroup>
    <PackageReference Include="..." Version="..." Condition="'$(TargetFramework)' == '...'" />
</ItemGroup>

其中 TargetFramework 的值必须是有效的TFM

将条件添加到 /a 封闭ItemGroup元素时也是如此。

Guesswork:我猜原因是,当在这里支持任意条件时,Visual Studio 不能很好地发挥作用。因为最后,它知道引用了哪些 nuget 包(最后是程序集)。通过更改 Visual Studio 中的相应设置来更改该TargetFramework值,因此它可以(手动)应对,相应地调整引用的包。对于任意的东西很难做到这一点。但这一切都只是猜测,可能完全错误。

于 2021-01-25T12:13:32.550 回答
1

我认为这是VS IDE nuget Restore的问题。而问题在于非sdk net框架项目的PackageReference nuget管理格式。但是,问题不在于 new-sdk 项目。

我已经多次测试了这个问题,VS IDE nuget restore将忽略该条件。毫无疑问,这是一个问题。

所以我建议你可以向团队报告这个问题

我在 Github 上提出了这个问题。

但是nuget restore并且msbuild restore可以指定non-sdk项目的条件。所以问题是和之间msbuild restore的区别。nuget restoreVS 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 上构建你的项目。

于 2021-01-27T02:44:28.123 回答