在MSBuild中,有一个变量$(BuildingInsideVisualStudio)可用于检测build是否在Visual Studio中运行,所以我可以执行以下条件:
<PropertyGroup Condition="'$(BuildingInsideVisualStudio)' != 'true'">
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
</PropertyGroup>
NuGet是否有类似的东西?如果要在包管理器中使用该项目,我希望运行其他条件。
答案 0 :(得分:2)
您对问题的评论听起来像您的目标是在单个项目中的不同条件下保持软件包版本一致,但这也是常见的情况,您希望在解决方案或存储库中的各个项目之间保持软件包版本一致。
我将提出另一种解决方案。在回购根目录中创建一个Directory.Build.props
,如下所示:
<Project>
<PropertyGroup>
<NewtonsoftJsonVersion>12.0.1</NewtonsoftJsonVersion>
<xunitVersion>2.4.1</xunitVersion>
</PropertyGroup>
</Project>
现在,在需要Newtonsoft.json的项目中,将PackageReference
更改为<PackageReference Include="Newtonsoft.Json" Version="$(NewtonsoftJsonVersion)" />
。
如果将生产代码放在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来检查版本,但不幸的是不能升级版本。为此,您需要手动编辑存储库根目录Directory.Build.props
(因此将其添加到您的解决方案中以便快速访问),但是您可以确信,对该软件包的每个引用都将使用相同的版本。它仅限于使用PackageReference
的项目,packages.config
目前没有解决方案,但MSBuild条件也仅适用于PackageReference
。
您经常可以在Microsoft存储库中看到这种模式。当然,NuGet(我的团队,是的!)以及诸如cli和sdk之类的各种.NET仓库都可以做到这一点,尽管在概念上是相同的,尽管在手动导入的道具文件中,而不是Directory.Build.props
。
答案 1 :(得分:0)
没有直接解决方案。 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>