Visual Studio MSBuild条件未评估

daolsyd0  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(187)

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

  1. <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看起来像这样:

  1. <PackageReference Include="Falvor1Package" Condition="'$(Flavor)'=='Flavor1'">
  2. <Version>1.1.1.1</Version>
  3. </PackageReference>
  4. <PackageReference Include="Falvor2Package" Condition="'$(Flavor)'=='Flavor2'">
  5. <Version>1.1.1.1</Version>
  6. </PackageReference>

2看起来像这样:

  1. <ItemGroup Condition="'$(Flavor)'=='Flavor1'">
  2. <PackageReference Include="Falvor1Package">
  3. <Version>1.1.1.1</Version>
  4. </PackageReference>
  5. </ItemGroup>
  6. <ItemGroup Condition="'$(Flavor)'=='Flavor2'">
  7. <PackageReference Include="Falvor2Package">
  8. <Version>1.1.1.1</Version>
  9. </PackageReference>
  10. </ItemGroup>

3看起来像这样:

  1. <Choose>
  2. <When Condition="'$(Flavor)'=='Flavor1'">
  3. <ItemGroup>
  4. <PackageReference Include="Falvor1Package">
  5. <Version>1.1.1.1</Version>
  6. </PackageReference>
  7. </ItemGroup>
  8. </When>
  9. </Choose>
  10. <Choose>
  11. <When Condition="'$(Flavor)'=='Flavor2'">
  12. <ItemGroup>
  13. <PackageReference Include="Falvor2Package">
  14. <Version>1.1.1.1</Version>
  15. </PackageReference>
  16. </ItemGroup>
  17. </When>
  18. </Choose>

我正在使用VS2019和MSBuild 16,我缺少什么?

wtzytmuj

wtzytmuj1#

阿法伊,那不管用。不能在PackageReference上使用任意条件(属性)。还可以看到:
您可以使用条件来控制是否包含包,其中条件可以使用任何MSBuild变量或在目标或props文件中定义的变量。但是,目前仅支持TargetFramework变量。
换句话说,你可以这样做,但不使用自定义属性:

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

其中,TargetFramework的值必须是有效的TFM。
这同样适用于将条件添加到/a封闭ItemGroup元素时。

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

bihw5rsg2#

我认为这是VS IDE nuget Restore上的问题。而这个问题是针对非sdk net framework项目的PackageReferencenuget管理格式。然而,这个问题并不适用于new-sdk项目。
我已经多次测试这个问题,VS IDE nuget restore会忽略这个条件。这无疑是一个问题。
所以我建议你可以向团队报告这个问题。
I have raised the issue on Github.

但是nuget restoremsbuild restore可以指定non-sdk项目上的条件。所以问题是msbuild restorenuget restoreVS IDE Restore之间的区别。
因此,作为建议,您可以对VS 2019的项目进行一些更改:

右键单击项目属性->构建事件->在预构建事件命令行中添加以下内容:

  1. "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\MSBuild.exe" -t:restore $(ProjectDir)

然后您就可以在VS 2019上构建您的项目,没有任何问题。

20jt8wwn

20jt8wwn3#

我是这样做到的:

  1. <Choose>
  2. <When Condition=" '$(Configuration)'=='Release' ">
  3. <ItemGroup>
  4. <PackageReference Include="Volo.Abp.Autofac" Version="7.3.2" />
  5. <PackageReference Include="Volo.Abp.Caching.StackExchangeRedis" Version="7.3.2" />
  6. </ItemGroup>
  7. </When>
  8. <When Condition=" '$(Configuration)'=='Debug' ">
  9. <ItemGroup>
  10. <ProjectReference Include="..\..\abp\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
  11. <ProjectReference Include="..\..\abp\framework\src\Volo.Abp.Caching.StackExchangeRedis\Volo.Abp.Caching.StackExchangeRedis.csproj" />
  12. </ItemGroup>
  13. </When>
  14. </Choose>

相关问题