首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略PackageReference条件

忽略PackageReference条件
EN

Stack Overflow用户
提问于 2018-02-02 20:17:01
回答 4查看 6.8K关注 0票数 12

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

这是我项目的一部分。我希望在配置是安装程序/AnyCPU并且VS正在构建net40风格时使用net40。

代码语言:javascript
复制
<?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>

是否有一种方法可以在安装程序构建中仅为docfx.console使用net40?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-05-24 19:49:21

甚至我也在寻找基于条件的nuget包引用(只有在DefineConstants中设置了预期常量时才会加载)。虽然@Luke解决方案对我有用,但我可以在没有外部目标文件的情况下使它工作。

解决方案是使用PackageReference选择>时包含

确保在包含PropertyGroup的DefineConstants之后有这个块。

代码语言:javascript
复制
<Choose>
<When Condition="$(DefineConstants.Contains('My_CONST'))">
  <ItemGroup>
  <PackageReference Include="MyPackage">
    <Version>1.0.6</Version>
  </PackageReference>
  </ItemGroup>
</When>  </Choose>
票数 11
EN

Stack Overflow用户

发布于 2019-05-07 18:59:25

总之,即使在条件为"false“的情况下,也将导入包。

代码语言:javascript
复制
<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

代码语言:javascript
复制
<Project Sdk="Microsoft.NET.Sdk">    
  <ItemGroup>
      <PackageReference Include="MyPackage" Version="1.0.0" />
  </ItemGroup>
</Project>

项目档案:

代码语言:javascript
复制
<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>
票数 14
EN

Stack Overflow用户

发布于 2018-02-06 05:53:23

忽略PackageReference条件

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

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

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

使用NuGet的Packages.config包并不总是在传递的NuGet环境(使用Project.json或PackageReferences的项目)中工作。在传递的NuGet环境中工作的包必须使用"contentFiles“而不是"content”--如果包想在这两种环境中工作,您可以同时使用两者。另外,install.ps1/uninstall.ps1不会在传递的NuGet环境中执行--但是,init.ps1将同时在Packages.config和传递环境中运行。

目前,还没有一个完美的解决方案,因此问题4837仍然是开放的。

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

希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48590270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档