NuGet API
本文是 NuGet 软件包的 API 文档。
此 API 由 NuGet 包管理器客户端使用并且通常不适合手动使用。
有关如何从极狐GitLab 软件包库上传和安装 NuGet 包的说明,请参阅 NuGet 软件包库文档。
这些端点不遵守标准的 API 身份验证方法。
软件包索引
返回特定软件包的索引,包括可用版本的列表。
GET projects/:id/packages/nuget/download/:package_name/index
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id |
string | yes | 项目的 ID 或完整路径 |
package_name |
string | yes | 软件包的名称 |
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/nuget/download/MyNuGetPkg/index"
响应示例:
{
"versions": [
"1.3.0.17"
]
}
下载软件包文件
下载 NuGet 软件包文件。元数据服务提供此 URL。
GET projects/:id/packages/nuget/download/:package_name/:package_version/:package_filename
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id |
string | yes | 项目的 ID 或完整路径 |
package_name |
string | yes | 软件包名称 |
package_version |
string | yes | 软件包版本 |
package_filename |
string | yes | 文件名称 |
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/nuget/download/MyNuGetPkg/1.3.0.17/mynugetpkg.1.3.0.17.nupkg"
将输出写入文件:
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/nuget/download/MyNuGetPkg/1.3.0.17/mynugetpkg.1.3.0.17.nupkg" > MyNuGetPkg.1.3.0.17.nupkg
将下载文件写入当前目录中的 MyNuGetPkg.1.3.0.17.nupkg
。
上传软件包文件
- NuGet v2 feed 引入于极狐GitLab 16.2。
双穿 NuGet 软件包文件:
-
NuGet v3 feed:
PUT projects/:id/packages/nuget
-
NuGet V2 feed:
PUT projects/:id/packages/nuget/v2
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id |
string | yes | 项目的 ID 或完整路径 |
package_name |
string | yes | 软件包名称 |
package_version |
string | yes | 软件包版本 |
package_filename |
string | yes | 文件名称 |
-
NuGet v3 feed:
curl --request PUT \ --form 'package=@path/to/mynugetpkg.1.3.0.17.nupkg' \ --user <username>:<personal_access_token> \ "https://gitlab.example.com/api/v4/projects/1/packages/nuget/"
-
NuGet v2 feed:
curl --request PUT \ --form 'package=@path/to/mynugetpkg.1.3.0.17.nupkg' \ --user <username>:<personal_access_token> \ "https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2"
上传符号软件包文件
上传 NuGet 符号软件包文件(.snupkg
):
PUT projects/:id/packages/nuget/symbolpackage
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id |
string | yes | 项目的 ID 或完整路径 |
package_name |
string | yes | 软件包名称 |
package_version |
string | yes | 软件包版本 |
package_filename |
string | yes | 文件名称 |
curl --request PUT \
--form 'package=@path/to/mynugetpkg.1.3.0.17.snupkg' \
--user <username>:<personal_access_token> \
"https://gitlab.example.com/api/v4/projects/1/packages/nuget/symbolpackage"
路由前缀
剩余的路由中有两组相同的路由,每个路由都在不同的范围内发出请求:
- 使用群组级前缀在群组范围内发出请求。
- 使用项目级前缀在单个项目范围内发出请求。
本文档中的示例均使用项目级前缀。
群组级
/groups/:id/-/packages/nuget
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id |
string | yes | 群组的 ID 或完整路径 |
项目级
/projects/:id/packages/nuget
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id |
string | yes | 项目的 ID 或完整路径 |
服务索引
V2 source feed/protocol
返回一个代表 v2 NuGet 源 feed 的服务索引的 XML 文档。不强制进行身份验证:
GET <route-prefix>/index
请求示例:
curl "https://gitlab.example.com/api/v4/projects/1/packages/nuget/index"
响应示例:
<?xml version="1.0" encoding="utf-8"?>
<service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2">
<workspace>
<atom:title type="text">Default</atom:title>
<collection href="Packages">
<atom:title type="text">Packages</atom:title>
</collection>
</workspace>
</service>
V3 source feed/protocol
- 在极狐GitLab 16.1 中改为公共。
返回可用的 API 资源列表。认证不是必需的:
GET <route-prefix>/index
示例请求:
curl "https://gitlab.example.com/api/v4/projects/1/packages/nuget/index"
示例响应:
{
"version": "3.0.0",
"resources": [
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/query",
"@type": "SearchQueryService",
"comment": "Filter and search for packages by keyword."
},
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/query",
"@type": "SearchQueryService/3.0.0-beta",
"comment": "Filter and search for packages by keyword."
},
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/query",
"@type": "SearchQueryService/3.0.0-rc",
"comment": "Filter and search for packages by keyword."
},
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata",
"@type": "RegistrationsBaseUrl",
"comment": "Get package metadata."
},
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata",
"@type": "RegistrationsBaseUrl/3.0.0-beta",
"comment": "Get package metadata."
},
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata",
"@type": "RegistrationsBaseUrl/3.0.0-rc",
"comment": "Get package metadata."
},
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/download",
"@type": "PackageBaseAddress/3.0.0",
"comment": "Get package content (.nupkg)."
},
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget",
"@type": "PackagePublish/2.0.0",
"comment": "Push and delete (or unlist) packages."
},
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/symbolpackage",
"@type": "SymbolPackagePublish/4.9.0",
"comment": "Push symbol packages."
}
]
}
响应中的 URL 所拥有的路由前缀与请求这些 URL 的路由前缀相同。如果您使用群组级路由进行请求,返回的 URL 包含 /groups/:id/-
。
元数据服务
返回软件包的元数据:
GET <route-prefix>/metadata/:package_name/index
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
package_name |
string | yes | 软件包名称 |
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata/MyNuGetPkg/index"
响应示例:
{
"count": 1,
"items": [
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata/MyNuGetPkg/1.3.0.17.json",
"lower": "1.3.0.17",
"upper": "1.3.0.17",
"count": 1,
"items": [
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata/MyNuGetPkg/1.3.0.17.json",
"packageContent": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/download/MyNuGetPkg/1.3.0.17/helloworld.1.3.0.17.nupkg",
"catalogEntry": {
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata/MyNuGetPkg/1.3.0.17.json",
"authors": "Author1, Author2",
"dependencyGroups": [],
"id": "MyNuGetPkg",
"version": "1.3.0.17",
"tags": "",
"packageContent": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/download/MyNuGetPkg/1.3.0.17/helloworld.1.3.0.17.nupkg",
"summary": "Summary of the package",
"published": "2023-05-08T17:23:25Z",
}
}
]
}
]
}
版本元数据服务
返回特定软件包版本的元数据:
GET <route-prefix>/metadata/:package_name/:package_version
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
package_name |
string | yes | 软件包名称 |
package_version |
string | yes | 软件包版本 |
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata/MyNuGetPkg/1.3.0.17"
响应示例:
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata/MyNuGetPkg/1.3.0.17.json",
"packageContent": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/download/MyNuGetPkg/1.3.0.17/helloworld.1.3.0.17.nupkg",
"catalogEntry": {
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata/MyNuGetPkg/1.3.0.17.json",
"authors": "Author1, Author2",
"dependencyGroups": [],
"id": "MyNuGetPkg",
"version": "1.3.0.17",
"tags": "",
"packageContent": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/download/MyNuGetPkg/1.3.0.17/helloworld.1.3.0.17.nupkg",
"summary": "Summary of the package",
"published": "2023-05-08T17:23:25Z",
}
}
搜索服务
给定查询,在仓库中搜索 NuGet 软件包:
GET <route-prefix>/query
参数 | 类型 | 是否必需 | 描述 |
---|---|---|---|
q |
string | yes | 搜索查询 |
skip |
integer | no | 跳过的结果数量 |
take |
integer | no | 返回的结果数量 |
prerelease |
boolean | no | 包含预发布版本。如果未提供值,则默认为 true
|
curl --user <username>:<personal_access_token> "https://gitlab.example.com/api/v4/projects/1/packages/nuget/query?q=MyNuGet"
响应示例:
{
"totalHits": 1,
"data": [
{
"@type": "Package",
"authors": "Author1, Author2",
"id": "MyNuGetPkg",
"title": "MyNuGetPkg",
"summary": "Summary of the package",
"totalDownloads": 0,
"verified": true,
"version": "1.3.0.17",
"versions": [
{
"@id": "https://gitlab.example.com/api/v4/projects/1/packages/nuget/metadata/MyNuGetPkg/1.3.0.17.json",
"version": "1.3.0.17",
"downloads": 0
}
],
"tags": ""
}
]
}
删除服务
- 引入于极狐GitLab 16.5。
删除 NuGet 软件包:
DELETE projects/:id/packages/nuget/:package_name/:package_version
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
id |
string | yes | ID 或项目的完整路径。 |
package_name |
string | yes | 软件包的名称。 |
package_version |
string | yes | 软件包的版本。 |
curl --request DELETE \
--user <username>:<personal_access_token> \
"https://gitlab.example.com/api/v4/projects/1/packages/nuget/MyNuGetPkg/1.3.0.17"
可能的请求响应:
Status | Description |
---|---|
200 |
File downloaded |
400 |
Bad request |
403 |
Forbidden |
404 |
Not found |
下载调试符号文件 .pdb
- 引入于极狐GitLab 16.7。
下载调试符号文件(.pdb
):
GET <route-prefix>/symbolfiles/:file_name/:signature/:file_name
属性 | 类型 | 是否必需 | 描述 |
---|---|---|---|
file_name |
string | yes | 文件的名称。 |
signature |
string | yes | 文件的签名。 |
Symbolchecksum |
string | yes | 必须的标头。文件的校验和。 |
curl --header "Symbolchecksum: SHA256:<file_checksum>" "https://gitlab.example.com/api/v4/projects/1/packages/nuget/symbolfiles/:file_name/:signature/:file_name"
将输出写入到文件:
curl --header "Symbolchecksum: SHA256:<file_checksum>" "https://gitlab.example.com/api/v4/projects/1/packages/nuget/symbolfiles/mynugetpkg.pdb/k813f89485474661234z7109cve5709eFFFFFFFF/mynugetpkg.pdb" > mynugetpkg.pdb
可能的请求响应:
状态 | 描述 |
---|---|
200 |
File downloaded |
400 |
Bad request |
403 |
Forbidden |
404 |
Not found |
V2 Feed 元数据端点
- 引入于极狐GitLab 16.3。
$metadata 端点
认证是可选的。返回 V2 feed 可用端点的元数据:
GET <route-prefix>/v2/$metadata
curl "https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2/$metadata"
示例响应:
<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" Version="1.0">
<edmx:DataServices xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" m:DataServiceVersion="2.0" m:MaxDataServiceVersion="2.0">
<Schema xmlns="http://schemas.microsoft.com/ado/2006/04/edm" Namespace="NuGetGallery.OData">
<EntityType Name="V2FeedPackage" m:HasStream="true">
<Key>
<PropertyRef Name="Id"/>
<PropertyRef Name="Version"/>
</Key>
<Property Name="Id" Type="Edm.String" Nullable="false"/>
<Property Name="Version" Type="Edm.String" Nullable="false"/>
<Property Name="Authors" Type="Edm.String"/>
<Property Name="Dependencies" Type="Edm.String"/>
<Property Name="Description" Type="Edm.String"/>
<Property Name="DownloadCount" Type="Edm.Int64" Nullable="false"/>
<Property Name="IconUrl" Type="Edm.String"/>
<Property Name="Published" Type="Edm.DateTime" Nullable="false"/>
<Property Name="ProjectUrl" Type="Edm.String"/>
<Property Name="Tags" Type="Edm.String"/>
<Property Name="Title" Type="Edm.String"/>
<Property Name="LicenseUrl" Type="Edm.String"/>
</EntityType>
</Schema>
<Schema xmlns="http://schemas.microsoft.com/ado/2006/04/edm" Namespace="NuGetGallery">
<EntityContainer Name="V2FeedContext" m:IsDefaultEntityContainer="true">
<EntitySet Name="Packages" EntityType="NuGetGallery.OData.V2FeedPackage"/>
<FunctionImport Name="FindPackagesById" ReturnType="Collection(NuGetGallery.OData.V2FeedPackage)" EntitySet="Packages">
<Parameter Name="id" Type="Edm.String" FixedLength="false" Unicode="false"/>
</FunctionImport>
</EntityContainer>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
OData 软件包实体端点
- 引入于极狐GitLab 16.4。
Endpoint | Description |
---|---|
GET projects/:id/packages/nuget/v2/Packages()?$filter=(tolower(Id) eq '<package_name>') |
返回一个 OData XML 文档,该文档包含有关给定名称的包的信息。 |
GET projects/:id/packages/nuget/v2/FindPackagesById()?id='<package_name>' |
返回一个 OData XML 文档,其中包含给定名称的包的相关信息。 |
GET projects/:id/packages/nuget/v2/Packages(Id='<package_name>',Version='<package_version>') |
返回一个 OData XML 文档,该文档包含具有给定名称和版本的包的相关信息。 |
curl "https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2/Packages(Id='mynugetpkg',Version='1.0.0')"
示例响应:
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xml:base="https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2">
<id>https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2/Packages(Id='mynugetpkg',Version='1.0.0')</id>
<category term="V2FeedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<title type="text">mynugetpkg</title>
<content type="application/zip" src="https://gitlab.example.com/api/v4/projects/1/packages/nuget/download/mynugetpkg/1.0.0/mynugetpkg.1.0.0.nupkg"/>
<m:properties>
<d:Version>1.0.0</d:Version>
</m:properties>
</entry>
极狐GitLab 没有收到针对
Packages()
和 FindPackagesByID()
端点的身份验证令牌,因此无法返回包的最新版本。在使用 NuGet v2 源安装或升级包时,您必须提供版本信息。curl "https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2/Packages()?$filter=(tolower(Id) eq 'mynugetpkg')"
示例响应:
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xml:base="https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2">
<id>https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2/Packages(Id='mynugetpkg',Version='')</id>
<category term="V2FeedPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<title type="text">mynugetpkg</title>
<content type="application/zip" src="https://gitlab.example.com/api/v4/projects/1/packages/nuget/v2"/>
<m:properties>
<d:Version></d:Version>
</m:properties>
</entry>