# Nuget 服务器搭建

随着公司业务发展,模块会越来越多,模块之间的依赖如果还是采用引用的方式管理,那真的是一件很痛苦的事情,而 NuGet (opens new window) 就是为了解决这个问题而生的。NuGet 不仅仅包含 dll 文件,它提供了很多方便的功能,比如安装某个包后执行一个脚本,或者是复制一些文件等等,这里不再介绍,感兴趣的 Coder 可以自行查看官方文档NuGet 文档 (opens new window)

微软官方提供了的包管理平台NuGet (opens new window),它允许任何人发布任何包,但是这些包都是公开的,对于企业业务模块来说,应该是私有的,不允许对外开放的。所以为了更好的管理业务模块的包,企业需要搭建私有的 NuGet 服务器。

# BaGet Or NuGet.Server

为什么用 BaGet (opens new window) 而不用 NuGet.Server (opens new window)

NuGet.Server (opens new window)是微软推出的轻量级的 NuGet 服务器,它是开源的,但是它是基于.Net Framework 的,只能运行在 Windows 服务器上,而且它不支持 NuGet 的 v3 版本的 API,不包含管理页面。

BaGet (opens new window)是国外大神开发的一款基于最新的.Net Core 的 NuGet 服务器,所以它是跨平台的,同时它也提供了一套友好的管理页面。

# 配置

使用 VS 打开项目,编辑appsettings.json配置文件

{
  //发布包时用到密钥
  "ApiKey": "15722E23-4D72-43D9-B8FA-264F7745778C",
  //包删除级别,默认Unlist,只允许卸载,不能硬删除,如果要硬删除修改为HardDelete
  "PackageDeletionBehavior": "Unlist",
  //启用包覆盖,启用后同一个包发布时相同的版本号会覆盖旧的文件,否则不允许发布
  "AllowPackageOverwrites": true,
  //数据库类型
  "Database": {
    "Type": "Sqlite",
    "ConnectionString": "Data Source=baget.db"
  },
  //存储方式,默认即可
  "Storage": {
    "Type": "FileSystem",
    "Path": ""
  },
  //查询方式
  "Search": {
    "Type": "Database"
  },
  //镜像配置,如果为true,则会自动从指定的PackageSource下载第三方包
  "Mirror": {
    "Enabled": false,
    "PackageSource": "https://api.nuget.org/v3/index.json"
  },
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

# 发布部署

BaGet 本身就是一个 ASP.NET Core 项目,所以发布部署参考官方文档即可,传送门:

使用 IIS 在 Windows 上托管 ASP.NET Core (opens new window)

使用 Nginx 在 Linux 上托管 ASP.NET Core (opens new window)

# 创建包

创建 NuGet 包有好几种方式,这里不再一一介绍,需要了解的请移步创建包 (opens new window)。 这里只介绍一种,也是个人认为最方便的一种,那就是MSBuild

通过 MSBuild 可以在编译项目时同步生成对应的 NuGet 包,包的信息通过在项目文件(.csproj)中进行配置,以下时一些配置说明,更多内容请移步使用 MSBuild 创建 NuGet 包 (opens new window)

  <PropertyGroup>
    <!--作者-->
    <Authors>SIEMENS</Authors>
    <!--包版本-->
    <Version>1.2.5</Version>
    <!--包描述-->
    <Description>模块核心库</Description>
    <!--是否生成xml文档(该文档会包含在nuget包中)-->
    <GenerateDocumentationFile>true</GenerateDocumentationFile>
    <!--编译项目时生成包-->
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <!--所属公司-->
    <Company></Company>
    <!--Copyright-->
    <Copyright></Copyright>
    <!--项目地址-->
    <PackageProjectUrl></PackageProjectUrl>
    <!--仓储地址-->
    <RepositoryUrl></RepositoryUrl>
  </PropertyGroup>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 发布包

发布包有两种方式:

1、通过NuGetPackageExplorer (opens new window)图形工具来发布,可在 windows10 应用商店里面直接搜索安装,该工具也可以创建编辑 NuGet 包

打开一个包

点击 File>Publish

最后发布即可~

2、通过 dotnet nuget CLI 发布

dotnet nuget push 包文件路径 -k 密钥 -s 包服务器地址

dotnet nuget push Nm.Module.Admin.Domain.1.2.1.nupkg -k qz2jga8pl3dvn2akksyquwcs9ygggg4exypy3bhxy6w6x6 -s http://localhost:5000/v3/index.json
1

如果有很多包,一个个发布是很通过的,所以你可以写一个 ps 脚本来批量发布

Get-ChildItem -Path ./XManager/_packages | ForEach-Object -Process{
    dotnet nuget push $_.fullname  -k qz2jga8pl3dvn2akksyquwcs9ygggg4exypy3bhxy6w6x6 -s http://localhost:5000/v3/index.json
}
1
2
3