VS 2017中的内置软件包不打包引用的程序集

时间:2018-07-14 12:20:42

标签: .net .net-core nuget .net-standard

使用VS 2017中的.NET Core / Standard项目中的“打包”选项卡,可以轻松地自动打包项目。但是,可以理解,没有从解决方案中引用其他项目。使用此流程打包依赖关系的唯一方法是将每个依赖关系发送给NuGet,从NuGet安装它,删除解决方案依赖关系(引用NuGet,而不是程序集)。

我的问题: 在解决方案中有2个.NET Standard项目A和B,其中B依赖于A,获得两个NuGet的最简单方法是什么-A.nupkg和B.nupkg,其中B.nupkg包含对A.nupkg的引用?

编辑:将PackageReference和ProjectReference都具有相同名称的dll是一个陷阱,但是VS2017似乎只打包作为PackageReference添加的dll。我想使用本地文件来构建解决方案,但是使用PackageReference将B.nupkg打包到A.nupkg。

EDIT2 到目前为止,我将引用从项目切换到NuGet,然后进行构建和打包,而不是切换回。现在,我决定浪费时间了,我在输入需要目标的PS脚本调用dotnet pack,但是也许有更简单的方法,可以利用“包装”标签中内置的功能?

1 个答案:

答案 0 :(得分:0)

解决方案是添加新的配置(例如“ Pack”),然后在* .projs中使用PackageReferences重复所有所需的ProjectReferences。

那么首先:解决方案-> RMB-> ConfigurationManager->新配置(从下拉列表中选择)

enter image description here

它将新的构建配置添加到.sln文件,并将适当的条目添加到所有* .proj文件。

在您要为其构建程序包的每个项目中,添加如下互斥条件:

  <ItemGroup>
    <PackageReference Include="Stocks.Data.Model" Version="2.0.0" Condition="'$(Configuration)' == 'Pack'" />
    <PackageReference Remove="Stocks.Data.Model" Version="2.0.0" Condition="'$(Configuration)' != 'Pack'" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\Stocks.Data.Model\Stocks.Data.Model.csproj" Condition="'$(Configuration)' != 'Pack'" />
    <ProjectReference Remove="..\Stocks.Data.Model\Stocks.Data.Model.csproj" Condition="'$(Configuration)' == 'Pack'" />
  </ItemGroup>

如您所见,这是同一个dll,只有一个来自NuGet,一个来自本地解决方案。这样,您可以通过一个下拉更改构建具有适当依赖性的所有NuGet。利用内置的机制,这是最干净的解决方案。同样不要忘记启用“ Generate NuGet package on build”以使其正常工作。

请注意,当前VS会在Dependencies中临时警告带有相关名称的dll的黄色警告图标,但这是正确的,因为每个配置都有一个dll-重新加载解决方案即可解决此问题。

参考文献: