使用WebAPI、.NET Core CLI、NuGet CLI操作Nuget源

最近项目上元数据开发,准备使用nuget包进行封装,所以对nuget源进行了一些研究主要包含以下三种。

WebAPI

官方文档说明上介绍nuget源提供的WebAPI是遵循Odata规范的,但是通过验证发现存在很多问题,大多数api接口只适应于nuget官方仓库,以下是经过测试可用的接口。如果有兴趣可以发掘更多,详情参考:https://docs.microsoft.com/zh-cn/nuget/api/overview

1. 获取指定包信息:

http://localhost/nuget/nuget/Packages(Id='Inspur.Ecp.Caf.Context',Version='1.0.0-alpha-1806300128')

2. 下载指定包信息:

http://localhost/nuget/nuget/Packages(Id='Inspur.Ecp.Caf.Context',Version='1.0.0-alpha-1806300128')/Download

3. 查询一个nuget包所有版本信息:

http://localhost/nuget/nuget/Packages?$filter=Id eq 'Inspur.Ecp.Caf.Caching'

4. 关键字搜索(例如caf):

这个地方要说一样,最早以为nuget提供的api接口是遵循Odata原则的,所以把Packages作为资源研究各种操作,最后百般尝试均已失败告终(感觉应该姿势不对)。最后无可奈何,修改了VS中的nuget.config配置文件,然后在输出窗口得到了这个api。searchTerm是搜索关键字,可以为空(即查找所有)。skip和top负责分页加载,其他属性不重要就不一一解释了

http://localhost/nuget/Search()?$filter=IsAbsoluteLatestVersion&searchTerm='caf'&targetFramework=''&includePrerelease=true&$skip=0&$top=26&semVerLevel=2.0.0

5. 上传nuget包(Put方法):

具体如何使用put方法上传文件,可以参考上篇

http://localhost/nuget/nuget/Packages

6. 查询所有包数量(每个包取最新版本):

因为前端展示需要分页,所以用到了这个方法

http://localhost/nuget/nuget/Packages/$count?$filter=IsAbsoluteLatestVersion

API接口获取到的返回信息示例

<?xml version="1.0" encoding="utf-8"?>
<entry xml:base="http://localhost/nuget/nuget" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:georss="http://www.georss.org/georss" xmlns:gml="http://www.opengis.net/gml">
    <id>http://localhost/nuget/nuget/Packages(Id='Inspur.Ecp.Caf.Caching',Version='1.0.0-alpha-1805240806')</id>
    <category term="NuGet.Server.Core.DataServices.ODataPackage" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
    <link rel="edit" href="http://localhost/nuget/nuget/Packages(Id='Inspur.Ecp.Caf.Caching',Version='1.0.0-alpha-1805240806')" />
    <link rel="self" href="http://localhost/nuget/nuget/Packages(Id='Inspur.Ecp.Caf.Caching',Version='1.0.0-alpha-1805240806')" />
    <title type="text">Inspur.Ecp.Caf.Caching</title>
    <published>2018-09-22T05:38:46Z</published>
    <updated>2018-09-22T05:38:46Z</updated>
    <author>
        <name>Inspur.Ecp.Caf.Caching</name>
    </author>
    <m:action metadata="http://localhost/nuget/nuget/$metadata#Container.Download" title="Download" target="http://localhost/nuget/nuget/Packages(Id='Inspur.Ecp.Caf.Caching',Version='1.0.0-alpha-1805240806')/Download" />
    <content type="application/zip" src="http://localhost/nuget/nuget/Packages(Id='Inspur.Ecp.Caf.Caching',Version='1.0.0-alpha-1805240806')/Download" />
    <m:properties>
        <d:Id>Inspur.Ecp.Caf.Caching</d:Id>
        <d:Version>1.0.0-alpha-1805240806</d:Version>
        <d:NormalizedVersion>1.0.0-alpha-1805240806</d:NormalizedVersion>
        <d:IsPrerelease m:type="Edm.Boolean">true</d:IsPrerelease>
        <d:Title m:null="true" />
        <d:Authors>Inspur.Ecp.Caf.Caching</d:Authors>
        <d:Owners>Inspur.Ecp.Caf.Caching</d:Owners>
        <d:IconUrl m:null="true" />
        <d:LicenseUrl m:null="true" />
        <d:ProjectUrl m:null="true" />
        <d:DownloadCount m:type="Edm.Int32">-1</d:DownloadCount>
        <d:RequireLicenseAcceptance m:type="Edm.Boolean">false</d:RequireLicenseAcceptance>
        <d:DevelopmentDependency m:type="Edm.Boolean">false</d:DevelopmentDependency>
        <d:Description>Package Description</d:Description>
        <d:Summary m:null="true" />
        <d:ReleaseNotes m:null="true" />
        <d:Published m:type="Edm.DateTime">2018-09-22T05:38:46.9446845Z</d:Published>
        <d:LastUpdated m:type="Edm.DateTime">2018-09-22T05:38:46.9446845Z</d:LastUpdated>
        <d:Dependencies>Inspur.Ecp.Caf.Common:1.0.0-alpha-1805160358:netstandard2.0|Inspur.Ecp.Caf.Configuration:1.0.0-alpha-1805180837:netstandard2.0|Inspur.Ecp.Caf.Exception:1.0.0-alpha-1805190142:netstandard2.0|Microsoft.Extensions.Caching.Memory:2.0.2:netstandard2.0|Microsoft.Extensions.Caching.Redis:2.0.2:netstandard2.0</d:Dependencies>
        <d:PackageHash>cx61NZsnDXHcx37hhC2Py51QJxO6vVX51Rciwqzr6tB0oFlAClqd+L4bgpG9uCCBjq4XhV6iLc1tSYrPXgjCcg==</d:PackageHash>
        <d:PackageHashAlgorithm>SHA512</d:PackageHashAlgorithm>
        <d:PackageSize m:type="Edm.Int64">14072</d:PackageSize>
        <d:Copyright m:null="true" />
        <d:Tags m:null="true" />
        <d:IsAbsoluteLatestVersion m:type="Edm.Boolean">false</d:IsAbsoluteLatestVersion>
        <d:IsLatestVersion m:type="Edm.Boolean">false</d:IsLatestVersion>
        <d:Listed m:type="Edm.Boolean">true</d:Listed>
        <d:VersionDownloadCount m:type="Edm.Int32">-1</d:VersionDownloadCount>
        <d:MinClientVersion m:null="true" />
        <d:Language m:null="true" />
    </m:properties>
</entry>

解析代码示例

对于返回结果,我们只关心nuget包的名称和版本。解析可以有多种形式,就是简单的xml读取就可以,这里只是一个简单的例子。

        private List<string> ResolveXml(string xmlStr)
        {
            List<string> packlist = new List<string>();
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xmlStr);
            string json = Newtonsoft.Json.JsonConvert.SerializeXmlNode(doc);
            JObject jo = JObject.Parse(json);
            JArray array = (JArray)jo["feed"]["entry"];

            foreach (var jObject in array)
            {
                packlist.Add(jObject["title"]["#text"].ToString() + "," + jObject["m:properties"]["d:Version"].ToString());
            }

            return packlist;
        }

.NET Core CLI

虽然API接口满足了大部分需求,但是将元数据文件打成nuget包还是需要借助其他CLI命令。由于项目本身是基于 .NET Core 2.1,自然首先想到的是使用dotnet相关命令。具体可以参考:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet?tabs=netcore21

1. 添加包:

这个命令相当于下载nuget包,但是必须要有一个project,和代码绑定的太死,这也是dotnet命令的一个机制,使用的话需要慎重考虑。具体参数可以参考:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-add-package

dotnet add F:\GSPCloud\onlineuser-core\src\StakeoutController package Microsoft.Azure.DocumentDB.Core -v 1.0.0 --package-directory D:\元数据

2. 生成包:

和前一个命令一样,包的生成也需要依赖于project,虽然最后发现可以指定.nuspec文件,但是依旧和代码工程绑定太死,局限性很大。具体参数可以参考:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-pack?tabs=netcore2x

dotnet pack .\StakeoutWebApi.csproj -o .\pack /p:PackageVersion=2.1.0;NuspecFile= .\test.nuspec

3. 上传包:

这里需要注意的一点就是-k参数,在nuget源中的配置中会有一个apikey,一般会记录在nuget.config文件中,用来进行认证。具体参数可以参考:https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-pack?tabs=netcore2x

https://docs.microsoft.com/zh-cn/dotnet/core/tools/dotnet-nuget-push?tabs=netcore21

说到这里,再附上一段代码执行CMD命令的示例

            //创建一个ProcessStartInfo对象 使用系统shell 指定命令和参数 设置标准输出
            var psi = new ProcessStartInfo("dotnet", str) { RedirectStandardOutput = true, CreateNoWindow = false };
            //启动
            var proc = Process.Start(psi);
            using (var sr = proc.StandardOutput)
            {
                while (!sr.EndOfStream)
                {
                    //后期可以记录日志
                   Console.WriteLine(sr.ReadLine());
                }

                if (!proc.HasExited)
                {
                    proc.Kill();
                }
            }

NuGet CLI

经过交流论证,发现还是使用原生的NuGet CLI最方便,虽然需要提前在环境中安装nuget.exe。这里只列举我们所需的三个,有兴趣可以去官网查看,具体可以参考:https://docs.microsoft.com/zh-cn/nuget/tools/nuget-exe-cli-reference?tdsourcetag=s_pctim_aiomsg

1. 添加包:

这里面也可以指定-Source,参数说明:https://docs.microsoft.com/zh-cn/nuget/tools/cli-ref-install

nuget install Inspur.GS.scm.sd.salesorder.metadata -version 1.0.0 -ConfigFile C:\Users\liu_wei\Desktop\GSPCloud\NuGet.Config -OutputDirectory D:\

2. 生成包:

不在依赖于project,可以指定生成路径,参数说明:https://docs.microsoft.com/zh-cn/nuget/tools/cli-ref-pack

nuget pack D:\test.nuspec -version 1.0.0 –OutputDirectory D:\

3. 上传包:

这里面-Source是必须的,-ConfigFile 指定配置文件,里面记录了认证信息等。参数说明:https://docs.microsoft.com/zh-cn/nuget/tools/cli-ref-push

nuget push D:\codes\inspur.ecp.caf.sqlmapping.1.0.0-alpha-1808231427.nupkg -Source http://localhost/nuget/nuget -ConfigFile C:\Users\liu_wei\Desktop\GSPCloud\NuGet.Config

猜你喜欢

转载自blog.csdn.net/u014715882/article/details/82890064