【问题标题】:Is there an equivalent of $(BuildingInsideVisualStudio) which will detect NuGet?是否有等效的 $(BuildingInsideVisualStudio) 可以检测 NuGet?
【发布时间】:2019-05-14 10:49:46
【问题描述】:

在 MSBuild 中有一个变量 $(BuildingInsideVisualStudio) 可以用来检测构建是否在 Visual Studio 中运行,所以我可以做这样的条件:

  <PropertyGroup Condition="'$(BuildingInsideVisualStudio)' != 'true'">
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
  </PropertyGroup>

NuGet 有什么类似的吗?如果项目正在包管理器中使用,我希望运行不同的条件。

【问题讨论】:

  • 我曾经有过这个问题,只是自己提出了一个问题。
  • 出于什么目的?我无法想象一个用例。与在命令行或 CI 代理上相比,您想在 VS 中恢复不同的包吗?
  • 之所以要这样做,是因为我的项目根据条件导入了不同的包。但是,当在包管理器中点击“更新”时,它只更新当时条件为“真”的包,而忽略其他包。

标签: msbuild nuget


【解决方案1】:

您对问题的评论听起来像是您的目标是在单个项目中保持包版本在不同条件下保持一致,但您希望在解决方案或存储库中的项目之间保持一致也是一种常见情况。

我将建议一个不同的解决方案。在您的 repo 根目录中创建一个 Directory.Build.props,如下所示:

<Project>
  <PropertyGroup>
    <NewtonsoftJsonVersion>12.0.1</NewtonsoftJsonVersion>
    <xunitVersion>2.4.1</xunitVersion>
  </PropertyGroup>
</Project>

现在在需要 Newtonsoft.json 的项目中,将 PackageReference 更改为 &lt;PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" /&gt;

如果你把你的生产代码放在src\,测试代码放在test\,那么你可以创建一个test\Directory.Build.props,内容如下:

<Project>
  <Import Project="$([MSBuild]::GetPathOfFileAbove('Directory.Build.props', '$(MSBuildThisFileDirectory)../'))" />

  <PropertyGroup>
    <PackageReference Include="xunit" Version="$(xunitVersion)" />
  </PropertyGroup>
</Project>

现在你test\下的所有项目都会自动获取xunit,并且保证是同一个版本。

当你想升级一个包版本时,你可以使用包管理器 UI 来检查版本,但遗憾的是不能升级版本。为此,您需要手动编辑 repo root Directory.Build.props(因此将其添加到您的解决方案中以便快速访问),但您可以确信对该包的每个引用都将使用相同的版本。仅限于使用PackageReference的项目,packages.config目前没有解决方案,但MSBuild条件也仅适用于PackageReference

您可以在 Microsoft 存储库中经常看到这种模式。当然,NuGet(我的团队,是的!),以及各种 .NET 存储库(如 cli 和 sdk)都可以做到这一点,尽管是在手动导入的 props 文件中,而不是 Directory.Build.props,尽管概念是相同的。

【讨论】:

  • 我专门问了原始问题,因为我想保持包管理器更新功能正常工作,所以很遗憾这不是解决方案。
  • @TimBooker 在这种情况下,我很有信心答案是否定的。我不太了解包管理器 UI 代码,但我不相信我们会评估设置任何属性的 MSBuild 项目。事实上,我根本不确定我们是否评估了 MSBuild 项目,我想我们只是向 VS 项目系统询问它的项目状态/“视图”。
  • 好吧,如果我描述的方式不完全可行,我会接受你的解决方案作为答案,因为它解决了一致性问题,即使我不得不在使用包管理器进行更新方面做出妥协。
【解决方案2】:

此案没有直接的解决方案。 NuGet 只是下载管理器,它加载源。 MSBuild 是一个构建系统,它构建源代码。他们之间不交换任何信息。

我建议你换一种方式。您可以使用

将 props 文件添加到您的 nuget 打包项目中
<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">

  <ItemGroup>
    <PackageUsedFromNuget>true</PackageUsedFromNuget>
  </ItemGroup>

</Project>

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多