9

In my VS 2017 project I reference docfx.console package and I want it to be used only when certain condition is met. But the package gets used for all builds.

Here is a part of my project. I want docfx.console to be used when configuration is Installer/AnyCPU and VS is building net40 flavor.

<?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>

Is there a way to use docfx.console in Installer build for net40 only?

4

4 回答 4

14

总而言之,即使条件为“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>
于 2019-05-07T18:59:25.657 回答
9

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

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

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

<Choose>
<When Condition="$(DefineConstants.Contains('My_CONST'))">
  <ItemGroup>
  <PackageReference Include="MyPackage">
    <Version>1.0.6</Version>
  </PackageReference>
  </ItemGroup>
</When>  </Choose>
于 2020-05-24T19:49:21.557 回答
3

PackageReference 条件被忽略

这是关于使用 nuget 包中的内容/工具文件的新样式 csproj PackageReference的已知问题。

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

在此处输入图像描述

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

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

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

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

希望这可以帮助。

于 2018-02-06T05:53:23.330 回答
0

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

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

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

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

于 2021-03-24T22:02:59.327 回答