NuGet使用

初识NuGet及快速安装使用  

NuGet是 Visual Studio的一个扩展,也就是管理程序的包包。

使用NuGet可以替代之前引用DLL文件的方式,如果Nuget库中存在需要的动态库的话。

参考:NuGet学习笔记(1) 初识NuGet及快速安装使用

打包自己的类库至Nuget

首先编写自己的类库项目,然后打包

  • 图形化界面方式

1、下载包管理器 NuGetPackageExplorer,(貌似 现在win10才行,所以我选择了命令行方式)顾名思义,包包管理器可以用来创建新的类库包,也可以浏览已经创建好的类库包

2、下载完成后,双击 NuGetPackageExplorer.application 进行安装,

双击NuGet Package Explorer出现启动界面,选择Create a new package(Ctrl+N)创建一个新包

3、选择菜单 Edit > Edit Package Metadata (或者 CTRL + K) 编辑包包信息
  这里可以编辑类库包的信息和添加类库、程序集的引用解释下几个比较重要的字段
  Id:用于定位类库包的唯一标示,如在命令行下执行 Install-Package MyPackage 这里的MyPackage就是包包的Id值
  Version:类库的版本号,这里建议和程序集的真实版本号保持一致,以免发生混淆
  Dependencies:此类库依赖的程序集,根据实际情况添加依赖类库的Id和版本号,若无留空即可,这里需要注意下填写的依赖类库需要在NuGet服务器上能找到,否则无法完成自动引用添加
  Framework assemblies:依赖的Framework 程序集,根据实际需要选择即可,一般无需设置

  除以上四项以外其他属性根据实际情况修改即可,若自己用不修改也中,不过为了使用方便还是建议把类库描述(Description)填写下

4、编辑好包包信息后接下来添加DLL到包包中
  可以选择 右键-->Add Existinng File... 选择dll添加,也可以直接拖拽DLL到 Package contents 窗口,此例选择拖拽方式

  直接拖拽dll到窗口后,会出现提示:是否将 Winista.HtmlParser.dll放到lib 文件夹下,一般我们选择是

5、信息修改和dll都添加完毕后,选择File --> Save(或Ctrl + S)将文件进行保存,默认文件名为Id + 版本号.nupkg

6、完成保存后如需要发布到网上,选择File--> Publish...(或Ctrl + P)
  默认的发布地址是官网,发布 Key需要到官网去注册一个账号,然后就可以得到,这里不在复述,若无需发布直接关闭即可

参考:NuGet学习笔记(2) 使用图形化界面打包自己的类库

  • 命令行方式

打包一个类库,并发布到官网。在开始之前需要在www.nuget.org上注册一个账号,下载最新版本的nuget命令行工具https://dist.nuget.org/win-x86-commandline/latest/nuget.exe【官网上下载】,只是一个exe文件,直接添加到环境变量中。

1.修改项目程序集信息AssemblyInfo.cs

using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("SY.Filer")]
[assembly: AssemblyDescription("文件操作帮助类,可以快速运用需要文件操作的应用中")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("SY")]
[assembly: AssemblyProduct("SY.Filer")]
[assembly: AssemblyCopyright("Copyright © Microsoft 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]

// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]

// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("62c2e0a8-d1f5-4547-92a0-ba19346883a4")]

// 程序集的版本信息由下列四个值组成: 
//
//      主版本
//      次版本
//      生成号
//      修订号
//
// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
View Code

2.命令行下使用nuget spec命令生成SY.Filer.nuspec打包配置文件

打开命令行定位到SY.Filer项目所在目录,输入命令:nuget spec

修改生成的nuspec文件,内容如下:

<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <license type="Expression">MIT</license>
     <projectUrl>https://www.cnblogs.com/peterYong/</projectUrl>
    <iconUrl>https://pic.cnblogs.com/face/727485/20190531113306.png</iconUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <releaseNotes>文件操作帮助类,可以快速运用需要文件操作的应用中</releaseNotes>
    <copyright>Copyright 2019</copyright>
    <tags>SY</tags>
  </metadata>
</package>

注意:

<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>  不要使用licenseUrl,已经弃用了,否则上传官网后 会提示你去修改它
iconUrl 会显示在你搜索 nuget包时显示的
releaseNotes 其实最好用英文

3.打包类库

打开命令行定位到SY.Filer项目所在目录,输入命令:nuget pack SY.Filer.csproj

可能的报错:Description is Required

需要在命令后面增加参数 -Properties Description="  "  尽量用英文
参考:https://stackoverflow.com/questions/40570795/nuget-exe-pack-warning-description-was-not-specified-using-description

4.发布类库

登陆www.nuget.org网站,打开https://www.nuget.org/packages/manage/upload地址

点击“Upload”上传后,显示信息确认页面,然后点击 “Submit”,发布完成。

若报错  Nuget上传包提示<licenseUrl> element will be deprecated的解决方法

过了一会,状态就ok了。

然后就可以在Nuget中搜索到了。

参考:使用nuget打包类库并发布

搭建属于自己的NuGet服务器

在下载Nuget包的时候通常有个source可以选择和配置

其实这里的source可以自己搭建。

创建NuGetServer Web站点

1.新建Web站点,选择 文件-->新建项目-->Asp.Net 空 Web应用程序

2.选择 工具-->Library Package Manager-->Package Manager Console 打开NuGet命令行控制台

3.在控制台输入Install-Package NuGet.Server (请保持Package source:官方源,即 Nuget offical package source,一般默认即为官方Package源)

4.回车确认后开始下载并安装NuGet.Server类库及相关引用,并自动添加引用到项目
  注:具体输出根据版本不同会略有不同

5.在控制台输入 Get-Package 可以看到刚刚安装的类库

6.至此NuGet.Server站点已经创建完毕,恩,你没有看错,就是这么简单,接下来部署到本地或IIS站点即可使用了

发布站点到IIS

1.发布网站到本地

2.IIS里面建立站点www.mynuget.com,主机头www.mynuget.com,应用程序池为.Net4.0集成模式,目录指向站点发布的目录

3.设置hosts 将www.mynuget.com指向本机

  127.0.0.1 www.mynuget.com

4.设置好hosts后,重新打开浏览器输入网址:http://www.mynuget.com/

5.查看已经发布的类库包 http://www.mynuget.com/nuget/Packages (可以把已经打好包的类库放到网站下的Packages文件夹下即可)

添加本地站点到包包数据源

1.选择 工具-->Library Package Manager-->Package Manager Settings 

2.输入名称 MyNuGetServer及包包源地址 http://www.mynuget.com/nuget 点击Add完成源添加

3.查看刚刚添加的类库源 工具-->Library Package Manager-->Manager NuGet Packages for Solution... 点击刚添加的源MyNuGetServer可以看到我们放到站点下的类库包,选中需要的包包点击 Install完成安装

参考:搭建属于自己的NuGet服务器

Nuget核心

它就是一个包(package)管理平台,确切的说是 .net平台的包管理工具,它提供了一系列客户端用于生成,上传和使用包(package),以及一个用于存储所有包的中心库即NuGet Gallery,如果有需要也可以搭建自己的私有NuGet库。

NuGet包的本质是一个以nupkg为后缀的zip压缩文件(你可以将后缀改为.zip后解压查看里面的内容),其中包含了编译后的Dll文件以及其他相关文件。下图显示nuget包从创建,上传到被使用的流程。

我们的项目文件 有一句

<TargetFramework>netcoreapp2.0</TargetFramework>

该项目的TargetFramework为netcoreapp2.0,这里的netcoreapp2.0 就是TFMs,即Tagrget Framework Monikers 翻译过来就是“目标框架别名”,这个值指定了这个项目是跑在哪个Framework上的。

1)你的项目要使用哪些API?2)你项目要兼容哪些Framework?

总的来说:

  1. 选择更高的版本,你将有更多的API可以使用。(更丰富的API)
  2. 选择更低的版本,有更多的项目可以使用你的库。(更好的兼容性)

所以 .net standard的选择原则就是:在API够用的情况下选择尽量低的 .net standard标准。这需要根据实际的项目需求来进行判断。

我们在Nuget上引入包,eg:Newtonsoft.Json,在项目文件夹下并不能找到dll,包在哪?其实包被下载到了一个nuget公共目录,在我的Windows10系统上是 C:Userswangl.nugetpackages,这样nuget包就不会被重复下载。而在项目中nuget仅仅将依赖信息写入了csproj项目文件与obj文件夹中的project.assets.json,其中csproj项目文件中的内容如下,

 <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
  </ItemGroup>

包所依赖的内容并不会被打包到最后的.nupkg文件中,NuGet只是将依赖信息写入包,在最终使用这些包的应用程序编译时还原所有的依赖

Nuget会帮我们管理所有包的依赖并且对于被多次引用的包,Nuget会找出满足该包所有使用者的版本。

其中重要的依赖关系(部分)如下,

 “如果你项目的目标框架也是.NETFramework 2.0,那么你就不需要依赖任何其它包就可以使用这个包”。同样的下面.NETFramework 1.0的含义就是:“如果你的项目的目标框架为.NETFramework 1.0那么需要引用下面的包后才能使用该包。”不过这些都不需要你手动去引用,NuGet会在你安装该包时自动安装其依赖的包。

参考:NuGet是什么?理解与使用(上)

原文地址:https://www.cnblogs.com/peterYong/p/10954296.html