MSBuild 条件未评估
MSBuild Conditions Not Evaluating
我有一个应用程序可以采用 3 种“风格”之一,这种风格仅取决于项目中引用的 NuGet 包。
为了简化构建,我想使用自定义 属性 来定义风格,然后在包引用上使用条件。
应该可以使用 Visual Studio 或使用 MSBuild CommandLine 构建应用程序。
我将其添加到 PropertyGroup:
<Flavor Condition= "'$(Flavor)'==''">Flavor1</Flavor>
我可以看到自定义 属性 设置正确,只是条件被忽略了
这是我试过的:
- 按照此处所述在 PackageReference 本身上设置条件:https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference-condition
- 将条件包放在单独的 ItemGroup 中并在那里设置条件
- 与 #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
我错过了什么?
据我所知,这是行不通的。您不能在 PackageReference
上使用任意条件(属性)。另见 this:
You can use a condition to control whether a package is included,
where conditions can use any MSBuild variable or a variable defined in
the targets or props file. However, at presently, only the
TargetFramework variable is supported.
换句话说,你可以做这样的事情,但不能使用你的习惯 属性:
<ItemGroup>
<PackageReference Include="..." Version="..." Condition="'$(TargetFramework)' == '...'" />
</ItemGroup>
其中 TargetFramework 的值必须是有效的 TFM。
将条件添加到包含 ItemGroup
元素的 the/a 时同样适用。
猜测:
我想原因是,当在这里支持任意条件时,Visual Studio 不能很好地发挥作用。因为最后,它知道引用了哪些 nuget 包(最后是程序集)。 TargetFramework
值通过更改 Visual Studio 中的相应设置来更改,因此它可以(手动)应对,相应地调整引用的包。对于任意的东西很难做到这一点。
但这一切都只是猜测,可能是完全错误的。
我认为这是 VS IDE nuget Restore 上的问题。问题是针对非sdk net framework项目的PackageReference nuget管理格式。但是,这个问题不是针对 new-sdk 项目。
我已经多次测试这个问题,VS IDE nuget restore 将忽略该条件。毫无疑问,这是一个问题。
所以我建议你 report the issue to the Team。
I have raised the issue on Github.
但是、nuget restore
和msbuild restore
可以在non-sdk
项目上指定条件。所以问题是msbuild restore
、nuget restore
和VS IDE Restore
之间的区别。
所以建议,你可以对VS2019的项目做一些修改:
右键单击 Project Properties-->Build Event--> 在 Pre 上添加-构建事件命令行:
"C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild\Current\Bin\MSBuild.exe" -t:restore $(ProjectDir)
和那么你就可以毫无问题地在VS2019上构建你的项目了。
我有一个应用程序可以采用 3 种“风格”之一,这种风格仅取决于项目中引用的 NuGet 包。 为了简化构建,我想使用自定义 属性 来定义风格,然后在包引用上使用条件。 应该可以使用 Visual Studio 或使用 MSBuild CommandLine 构建应用程序。 我将其添加到 PropertyGroup:
<Flavor Condition= "'$(Flavor)'==''">Flavor1</Flavor>
我可以看到自定义 属性 设置正确,只是条件被忽略了 这是我试过的:
- 按照此处所述在 PackageReference 本身上设置条件:https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference-condition
- 将条件包放在单独的 ItemGroup 中并在那里设置条件
- 与 #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 我错过了什么?
据我所知,这是行不通的。您不能在 PackageReference
上使用任意条件(属性)。另见 this:
You can use a condition to control whether a package is included, where conditions can use any MSBuild variable or a variable defined in the targets or props file. However, at presently, only the TargetFramework variable is supported.
换句话说,你可以做这样的事情,但不能使用你的习惯 属性:
<ItemGroup>
<PackageReference Include="..." Version="..." Condition="'$(TargetFramework)' == '...'" />
</ItemGroup>
其中 TargetFramework 的值必须是有效的 TFM。
将条件添加到包含 ItemGroup
元素的 the/a 时同样适用。
猜测:
我想原因是,当在这里支持任意条件时,Visual Studio 不能很好地发挥作用。因为最后,它知道引用了哪些 nuget 包(最后是程序集)。 TargetFramework
值通过更改 Visual Studio 中的相应设置来更改,因此它可以(手动)应对,相应地调整引用的包。对于任意的东西很难做到这一点。
但这一切都只是猜测,可能是完全错误的。
我认为这是 VS IDE nuget Restore 上的问题。问题是针对非sdk net framework项目的PackageReference nuget管理格式。但是,这个问题不是针对 new-sdk 项目。
我已经多次测试这个问题,VS IDE nuget restore 将忽略该条件。毫无疑问,这是一个问题。
所以我建议你 report the issue to the Team。
I have raised the issue on Github.
但是、nuget restore
和msbuild restore
可以在non-sdk
项目上指定条件。所以问题是msbuild restore
、nuget restore
和VS IDE Restore
之间的区别。
所以建议,你可以对VS2019的项目做一些修改:
右键单击 Project Properties-->Build Event--> 在 Pre 上添加-构建事件命令行:
"C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild\Current\Bin\MSBuild.exe" -t:restore $(ProjectDir)
和那么你就可以毫无问题地在VS2019上构建你的项目了。