序
Java有Maven中央库,而.Net有NuGet库
每次新建项目时,都要重新NuGet安装很多框架,很麻烦,所以今天捣鼓了一下NuGet打包与发布的方法,并将自己写的常用方法、封装的库方法和类扩展方法分享出来。与第三方库作为依赖,打包在一起,生成一个nupkg包发布到NuGet官方库里,后续新建项目时,只需要一个NuGet命令,自动安装各种库和依赖。
一直想要把自己常用的工具类和一些自己写的方法打包成独立的dll,发布到NuGet中央库里,这样每次只要一个命令,就可以使用各种提前封装好的方法了
准备工作
微软账号
:可以自己注册一个,我使用的是很久以前注册的Hotmail账号【Hotmail】NuGet程序
:一个独立的exe程序,需要加入到系统环境变量PATH中【下载地址】- 需要
打包的项目
- 管理员运行
cmd
或powershell
notepad++
:用来修改一些配置参数,不推荐微软自带的notepad(记事本)
生成nuspec配置文件
具体详细介绍,可以到微软官方文档查看:nuspec
进入到项目的目录里,然后在地址栏输入cmd
,并执行命令:nuget spec
随后创建成功会提示:已成功创建“Kang.Framework.Util.nuspec”。
,这个时候不要关闭cmd界面,等会还要使用
成功后你会在项目目录里看见一个后缀为nuspec
的文件,这个就是NuGet打包的配置文件了
我们需要将内容修改一下:
<?xml version="1.0" encoding="utf-8"?>
<package >
<metadata>
<id>Kang.Framework.Util</id>
<version>0.0.0.2</version>
<title>$title$</title>
<authors>Hao Zekang</authors>
<owners>$author$</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<license type="expression">MIT</license>
<projectUrl>https://blog.haozekang.com</projectUrl>
<iconUrl>https://blog-static.cnblogs.com/files/haozekang/kang.ico</iconUrl>
<description>自己用的Framework工具集</description>
<releaseNotes>工具集</releaseNotes>
<copyright>Copyright 2020</copyright>
<tags>Kang Util</tags>
<dependencies>
<group targetFramework=".NETFramework4.0" />
</dependencies>
</metadata>
</package>
其中id
、version
、description
、authors
四个节点为必填
项
打包
继续在cmd命令行界面输入命令:nuget pack Kang.Framework.Util.csproj
nuget pack <项目文件全名>
打包成功效果如下图,打包成功会在工程目录下生成一个nupkg文件
这里对警告进行解释一下
NU5128
:没有指定group
和目标框架
,并建议指定.NETFramework4.0
框架,报这个警告,属于最新版NuGet程序的BUG吧,好像使用低版本的NuGet程序不存在这个问题NU5048
:警告用户iconUrl是弃用节点,建议修改为icon节点
修改nupkg文件
,我电脑使用的是7-Zip
压缩软件
在打开的压缩包界面,找到nuspec文件
并编辑,可以看到打包好的配置文件中没有包含我们配置文件设置的group
节点信息,需要我们自己再手动给添加进去
修改后内容如下:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
<metadata>
<id>Kang.Framework.Util</id>
<version>0.0.0.2</version>
<title>Kang.Framework.Util</title>
<authors>Hao Zekang</authors>
<owners>Hao Zekang</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<license type="expression">MIT</license>
<licenseUrl>https://licenses.nuget.org/MIT</licenseUrl>
<projectUrl>https://blog.haozekang.com/</projectUrl>
<iconUrl>https://blog-static.cnblogs.com/files/haozekang/kang.ico</iconUrl>
<description>自己用的Framework工具集</description>
<releaseNotes>工具集</releaseNotes>
<copyright>Copyright 2020</copyright>
<tags>Kang Util</tags>
<dependencies>
<group targetFramework=".NETFramework4.0">
<dependency id="HtmlAgilityPack" version="1.11.24" />
<dependency id="Kang.Framework.ExtendMethod" version="0.0.0.2" />
</group>
</dependencies>
</metadata>
</package>
返回压缩包界面会提示是否保存,当然选择是
发布
如果检测到已存在的id
或该id已发布过该版本号
,则提示无法修改
检测该id和版本可以发布时,会弹出如下界面
点击发布后,你会进入到一个验证等待界面,看到一个黄色的提示信息,信息内容如下图红色圈出部分,然后一般等待几分钟再刷新界面即可看到NuGet安装命令了,代表发布包成功了!
发布后效果
点进去以后如下图所示
体验一波
-
新建一个WPF项目
NuGetTest
-
输入命令:
Install-Package Kang.WPF.ExtendMethod -Version 0.0.0.4
-
因为是
MahApps.Metro
项目,所以修改App.xaml
如下:
<Application x:Class="NuGetTest.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:NuGetTest"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml">
</ResourceDictionary>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml">
</ResourceDictionary>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml">
</ResourceDictionary>
<ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml">
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
- 修改MainWindow.xaml和cs如下:
<metro:MetroWindow x:Class="NuGetTest.MainWindow"
xmlns:metro="http://metro.mahapps.com/winfx/xaml/controls"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:NuGetTest"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<metro:MetroWindow.RightWindowCommands>
<metro:WindowCommands>
<Button Content="退出账号" Padding="0 0 0 0" Cursor="Hand" Margin="5 0 5 0"/>
<TextBlock x:Name="txt_name" Text="用户:" Margin="5 0 5 0" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock>
</metro:WindowCommands>
</metro:MetroWindow.RightWindowCommands>
<Grid>
</Grid>
</metro:MetroWindow>
using MahApps.Metro.Controls;
namespace NuGetTest
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : MetroWindow
{
public MainWindow()
{
InitializeComponent();
}
}
}
- 运行项目效果
注意事项
- NuGet一旦
Upload
一个版本的nupkg包
,就禁止永久删除
,也不能覆盖
,所以上传需谨慎!
nuget delete
命令也只是删除包的查询和显示,只是状态Status
变成了Unlisted
,而不是真正删除!
- 配置文件中
id
、version
、description
、authors
四个节点为必填
项 - NuGet打包时有一个BUG,就是目标框架问题,
dependencies
中的group
不会被打包的nupkg包中,需要我们手动去修改打包好的nupkg文件。还有一点,group
与dependency
不能同时存在dependencies
节点下,如果dependencies
下面出现了group
节点,那dependencies
下的dependency
就都要放到group
里
nupkg文件
可以使用7-Zip
等压缩软件直接打开