【问题标题】:PackageReference condition is ignoredPackageReference 条件被忽略
【发布时间】:2018-07-13 09:39:45
【问题描述】:

在我的 VS 2017 项目中,我引用了 docfx.console 包,我希望它仅在满足特定条件时使用。但是该软件包可用于所有构建。

这是我项目的一部分。我希望在配置为 Installer/AnyCPU 并且 VS 正在构建 net40 风格时使用 docfx.console。

<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net40;netstandard1.3;netstandard2.0</TargetFrameworks>
    <!-- ... -->
    <Configurations>Debug;Release;Installer</Configurations>
  </PropertyGroup>

  <ItemGroup Condition=" '$(TargetFramework)'=='net40' ">
    <!-- ... -->
    <PackageReference Include="docfx.console" Version="2.30.0" Condition="'$(Configuration)|$(Platform)'=='Installer|AnyCPU'" />
  </ItemGroup>

    <!-- ... -->
</Project>

有没有办法在 Installer build for net40 中使用 docfx.console?

【问题讨论】:

标签: visual-studio msbuild csproj docfx


【解决方案1】:

总而言之,即使条件为“false”,也会导入包。

<Project Sdk="Microsoft.NET.Sdk">    
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp3.0;netcoreapp2.2;net472</TargetFrameworks>
    <Platforms>x64;x86</Platforms>
  </PropertyGroup>
  <ItemGroup Condition="false">
      <PackageReference Include="MyPackage" Version="1.0.0" />
  </ItemGroup>
</Project>

我们发现我们可以通过将包引用放在不同的文件中来解决此问题,并使文件的导入有条件。

单独的文件:packagerefs.targets

<Project Sdk="Microsoft.NET.Sdk">    
  <ItemGroup>
      <PackageReference Include="MyPackage" Version="1.0.0" />
  </ItemGroup>
</Project>

项目文件:

<Project Sdk="Microsoft.NET.Sdk">    
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp3.0;netcoreapp2.2;net472</TargetFrameworks>
    <Platforms>x64;x86</Platforms>
  </PropertyGroup>
  <Import Project="packagerefs.targets" Condition="false" />
</Project>

【讨论】:

  • 哇,修复它的好方法!我在 msdocs 页面中创建了一个 GitHub 问题,它清楚地表明这应该可以工作,因为我不确定在哪里创建它! github.com/NuGet/docs.microsoft.com-nuget/issues/1840,如果有人看到这个,请支持它或任何未来相关的问题!
  • 另外值得注意的是,&lt;Import Project=".." /&gt; 必须在根级别,它不能嵌套在 &lt;PropertyGroup /&gt;
  • 睡了一夜之后,并创建了一个新的解决方案+项目来尝试重现此问题,今天早上的情况似乎正常!不知道昨天发生了什么,但这在当时肯定是固定的!我也尝试在原始项目上进行复制,但 ItemGroup Condition 似乎得到了尊重。无论如何,这确实设法让我解决了我原来的问题!
【解决方案2】:

即使我在寻找基于条件的引用 nuget 包(仅在 DefineConstants 中设置预期常量时才加载)。尽管@Luke Schoen 解决方案对我有用,但我可以在没有外部目标文件的情况下使其工作。

解决方案是使用 Choose > When

包含您的 PackageReference

确保在具有 DefineConstants 的 PropertyGroup 之后有此块。

<Choose>
<When Condition="$(DefineConstants.Contains('My_CONST'))">
  <ItemGroup>
  <PackageReference Include="MyPackage">
    <Version>1.0.6</Version>
  </PackageReference>
  </ItemGroup>
</When>  </Choose>

【讨论】:

    【解决方案3】:

    PackageReference 条件被忽略

    这是一个known issue,关于新样式 csproj PackageReference 用于处理 nuget 包中的内容/工具文件。

    在包docfx.console 中,看起来docfx.console 有“content”、“build”和“tools”,其中没有.NET 代码,只是随机文件:

    在这种情况下,当我们安装这个 nuget 包时,nuget 不会做任何事情。所以它似乎被用于所有构建。那是因为:

    适用于 Packages.config 的 NuGet 包并不总是适用于 传递 NuGet 环境(使用 Project.json 的项目或 包参考)。在传递 NuGet 中工作的包 环境必须使用“contentFiles”而不是“content”——你可以 如果一个包想在这两种环境中工作,两者都有。还, install.ps1/uninstall.ps1 不在传递 NuGet 中执行 环境——然而,init.ps1 将在 Packages.config 中工作 和传递环境。

    目前还没有完美的解决方案,所以the issue 4837仍然开放。

    要解决此问题,需要将 NuGet docfx.console 包更改为使用 contentFiles 并定义目标,并且通常会使用 $(MSBuildThisFileDirectory)..\tools\MyTool.exe 引用工具。如果将此PackageName.targets 文件放入构建目录,它将自动包含在引用 NuGet 包的项目中。

    希望这会有所帮助。

    【讨论】:

    【解决方案4】:

    在我的情况下,我也遇到了同样的问题 - 但根本原因是在执行 nuget 包构建时未定义某些 msbuild 属性 - 特别是未定义 $(SolutionName)Condition 仍会被评估,只是由于某种原因它返回 true。 (您可以通过输入Condition="false" 来测试它——它将被省略)。

    我的解决方案是检查是否定义了属性,例如:

      <ItemGroup Condition="'$(SolutionName)' != '' and $(SolutionName.Contains('SolutionCustomTag'))">
        <Reference Include="...">
    

    第一条语句'$(SolutionName)' != '' and - 测试该属性是否已定义。

    【讨论】:

      猜你喜欢
      • 2020-10-15
      • 2019-12-17
      • 2019-06-02
      • 2016-02-09
      • 2021-08-04
      • 2019-09-11
      • 1970-01-01
      • 2022-12-09
      • 2021-01-22
      相关资源
      最近更新 更多