Msbuild 为解决方案中的单个项目禁用NuGet BuildPackage

Msbuild 为解决方案中的单个项目禁用NuGet BuildPackage,msbuild,nuget,Msbuild,Nuget,我们在解决方案和项目中使用标准的NuGet.targets文件在构建时进行包更新和包创建 现在的问题是:当我们构建这样的解决方案时: msbuild MySolution.sln /P:Configuration=Release;BuildPackage=true;PackageOutputDir="..\CreatedPackages" 然后,NuGet.targets文件开始运行,并为解决方案中的所有项目构建包。 因此,我们实际上也为单元测试和集成测试项目提供了Nuget包,这是我们不想要

我们在解决方案和项目中使用标准的NuGet.targets文件在构建时进行包更新和包创建

现在的问题是:当我们构建这样的解决方案时:

msbuild MySolution.sln /P:Configuration=Release;BuildPackage=true;PackageOutputDir="..\CreatedPackages"
然后,NuGet.targets文件开始运行,并为解决方案中的所有项目构建包。 因此,我们实际上也为单元测试和集成测试项目提供了Nuget包,这是我们不想要的

在这些项目中无条件地设置属性
false
,没有任何帮助,因为该属性已由命令行设置,以后无法更改。我不想更改
nuget.targets
文件


因此,问题是:如何防止在解决方案中为特定项目创建包,而其他项目应构建其包?

问题是,nuget.targets文件连接到解决方案中的所有项目配置文件(.csproj),而BuildPackage目标也在nuget.targets文件中。 解决这个问题有两个办法:

  • 对于不需要nuget.targets的项目,也就是说它们不需要在构建过程中恢复包,您可以从它们的.csproj配置文件中删除对nuget.target文件的导入

  • 将BuildPackage目标复制到项目配置文件(.csproj),仅复制到要打包的项目,然后将其从nuget.targets中删除。这将隔离BuilPackage目标,仅限于相关项目


    • 如果不修改
      Nuget.targets
      文件,似乎无法解决此问题

      我们所做的是引入了一个新属性“SkipBuildPackage”,它在
      nuget.targets
      文件中默认设置为
      false

      然后,当
      SkipBuildPackage
      设置为
      true
      时,
      BuildPackage
      目标会获得一个附加条件,该条件会评估此属性,并且不会执行目标

      在默认情况下不希望构建包的项目的项目文件中,我们将此属性设置为
      true

      但是,通过在命令行上指定
      /p:SkipBuildPackage=false
      ,仍然可以为这些项目构建包。这将覆盖项目文件中的属性和
      nuget.targets
      文件中的默认属性,并防止跳过所有包

      通过在
      .csproj
      文件中为
      false
      提供
      属性值,您可以忽略该项目,而不将其打包为nuget包

      true
      -创建包

      false
      -不创建包

      以下是
      .csproj
      文件的示例副本

      <PropertyGroup>
         <OutputType>Exe</OutputType>
         <TargetFramework>netcoreapp3.1</TargetFramework>
         <PublishRepositoryUrl>false</PublishRepositoryUrl>
         <IsPackable>false</IsPackable>
      </PropertyGroup>
      
      
      Exe
      netcoreapp3.1
      假的
      假的
      
      删除nuget targets文件确实不是一个选项,因为我们(仍然)依赖旧的包还原功能。编辑nuget.targets文件是我们不喜欢的,但它似乎是目前唯一的选择。