PackageReference条件被忽略

时间:2018-02-02 20:17:02

标签: visual-studio msbuild csproj docfx

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

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

dataframe['name'].value_counts().idxmax()

有没有办法在netler的buildler版本中使用docfx.console?

4 个答案:

答案 0 :(得分:7)

即使我一直在寻找基于条件的nuget包(仅当在DefineConstants中设置了预期常数时才加载)。尽管@Luke Schoen Solution为我工作,但我可以在没有外部目标文件的情况下使其工作。

解决方案是使用选择>何时

包含您的PackageReference。

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

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

答案 1 :(得分:1)

  

忽略PackageReference条件

这是关于新样式csproj PackageReference的known issue,用于处理nuget包中的content / Tools文件。

docfx.console包中,看起来docfx.console有&#34; content&#34;,&#34; build&#34;和&#34; tools&#34;没有.NET代码,只是随机文件:

enter image description here

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

  

使用Packages.config的NuGet包,不要总是在工作   传递NuGet环境(使用Project.json或   PackageReferences)。在传递NuGet中工作的包   环境必须使用&#34; contentFiles&#34;而不是&#34;内容&#34; - 您可以   如果一个包想要在两个环境中工作,那么两者都有。也,   install.ps1 / uninstall.ps1不会在传递的NuGet中执行   环境 - 但是,init.ps1将在两个Packages.config中工作   和传递环境。

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

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

希望这有帮助。

答案 2 :(得分: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>

我们发现,可以通过将packagereference放在另一个文件中并有条件地导入文件来解决此问题。

单独的文件: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>

答案 3 :(得分:0)

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

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

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

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