.Net core 程序Nuget包独立存放 (二)

在上篇博文.Net core 程序Nuget包独立存放(一)中介绍了运行环境中,如何实现将nuget库存放,还有一个问题没有解决:如何将nuget包从publish的程序集中分离。本文就介绍下如何解决这个问题:

首先,利用dotnet store命令,将nuget包导出,同时并生成目标清单。

dotnet store -m test.csproj -r win-x64 --skip-optimization --skip-symbols -o r:\packages

这个命令也可以用于解决方案文件,输出结果如下:

test.csproj 的还原在 488.63 ms 内完成。
Files were composed in r:\packages\x64\netcoreapp3.1\
The list of packages stored is in r:\packages\x64\netcoreapp3.1\artifact.xml

其中,展示了nuget包的存储路径,以及程序清单文件。

然后,在发布的时候,指定nuget目标清单,则会裁剪对应的程序包。

dotnet publish --manifest r:\packages\x64\netcoreapp3.1\artifact.xml

再配合上文的设置,修改xxx.runtimeconfig.json文件,指定程序搜索路径,即可实现nuget包独立存储。

{
  "runtimeOptions": {
    "tfm""netcoreapp3.1",
    "framework": {
      "name""Microsoft.NETCore.App",
      "version""3.1.0"
    },
    "additionalProbingPaths": [
      "R:\\packages\\x64\\netcoreapp3.1"
    ]
  }
}

该路径也可以写成自适应的方式:

"R:\\packages\\|arch|\\|tfm|"

遇到的问题

实际使用中,就会发现,对于稍微大一点的项目,会存在程序集互相依赖的情况,这个时候dotnet store目录非常容易出错。试了各种参数,也没有找到方法解决。正当我准备放弃的时候,发现了另一种途径。

  1. 用dotnet list package命令,枚举出解决方案或项目中依赖的所有程序包
  2. 新建一个简单的工程,将这些程序包囊括进去,一个示例如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <OutputType>Library</OutputType>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="System.Interactive" Version="4.0.0" />
    <PackageReference Include="StackExchange.Redis" Version="2.0.601" />
    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
    <PackageReference Include="RabbitMQ.Client" Version="5.1.2" />
  </ItemGroup>
</Project>

我的做法是将解决方案的所有Nuget程序包去重后合入一个工程文件,再对这个工程进行dotnet store命令,就非常容易的导出nuget库了。

猜你喜欢

转载自www.cnblogs.com/TianFang/p/12424902.html