0. 参考说明

本文参考自以下文章

1. 前言

在实际生产中,因为隐私、策略等原因,会在公司内网搭建私有的NuGet服务器统一管理;对于平常的开发来说,自己总结的类库、工具也可以发布到私有的NuGet服务器上,便于其他项目使用。

2. 搭建

🟡 基于Docker和DockerCompose

2.1. 创建baget.env

在~/docker/baget目录创建baget.env文件:

1
vim ~/docker/baget/baget.env

粘贴如下内容:

1
2
3
4
5
6
ApiKey=NUGET-SERVER-API-KEY
Storage__Type=FileSystem
Storage__Path=/var/baget/packages
Database__Type=Sqlite
Database__ConnectionString=Data Source=/var/baget/baget.db
Search__Type=Database

说明:ApiKey即上传和删除NuGet包时使用的key,可以自定义

2.2. 启动容器

在新建docker-compose.yml文件或在已有文件中追加BaGet相关配置:

1
2
3
4
5
6
7
8
9
10
11
# /docker-compose.yml
version: '3.1'
services:
baget:
image: loicsharma/baget
ports:
- 5000:80
env_file: ~/docker/baget/baget.env
volumes:
- ~/docker/baget/data:/var/baget
- ~/docker/baget/appsettings.json:/app/appsettings.json

appsettings.json中可以配置相同名称版本的包是否可以覆盖以及硬删除

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
41
42
43
44
45
46
47
{
"ApiKey": "",
// "PackageDeletionBehavior": "Unlist", //包删除的行为逻辑,默认为软删除
"PackageDeletionBehavior": "HardDelete",
// "AllowPackageOverwrites": false, //是否允许覆盖原有包,默认为不允许
"AllowPackageOverwrites": true,
"Database": {
"Type": "Sqlite",
"ConnectionString": "Data Source=baget.db"
},
"Storage": {
"Type": "FileSystem",
"Path": ""
},
"Search": {
"Type": "Database"
},
"Mirror": {
"Enabled": false,
// Uncomment this to use the NuGet v2 protocol
//"Legacy": true,
"PackageSource": "https://api.nuget.org/v3/index.json"
},
// Uncomment this to configure BaGet to listen to port 8080.
// See: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-3.1#listenoptionsusehttps
//"Kestrel": {
// "Endpoints": {
// "Http": {
// "Url": "http://localhost:8080"
// }
// }
//},
"Logging": {
"IncludeScopes": false,
"Debug": {
"LogLevel": {
"Default": "Warning"
}
},
"Console": {
"LogLevel": {
"Microsoft.Hosting.Lifetime": "Information",
"Default": "Warning"
}
}
}
}

启动容器:

1
docker-compose up -d

2.3. 验证是否成功

打开浏览器,输入http://服务器ip:5000出现如下页面:

image-20220908200823732

输入http://服务器ip:5000/v3/index.json出现如下页面:

image-20220908200832313

上面两个页面都能打开说明启动成功

2.4. 上传NuGet包

1
2
3
4
# dotnet nuget push [<ROOT>] [-s|--source <SOURCE>] [-k|--api-key <API_KEY>]
# [<ROOT>]:需要上传的NuGet包的路径
# <API_KEY>:baget.env中ApiKey的值
dotnet nuget push newtonsoft.json.11.0.2.nupkg -s http://服务器ip:5000/v3/index.json -k NUGET-SERVER-API-KEY

图例:

image-20220908212009302

2.5. 删除NuGet包

1
2
3
4
# dotnet nuget delete [<PACKAGE_NAME> <PACKAGE_VERSION>] [-s|--source <SOURCE>] [-k|--api-key <API_KEY>]
# <PACKAGE_NAME>:NuGet包名
# <PACKAGE_VERSION>:NuGet版本
dotnet nuget delete newtonsoft.json 11.0.2 -s http://服务器ip:5000/v3/index.json -k NUGET-SERVER-API-KEY

图例:

image-20220908202213332