1. 下载nuget.exe,并放到要打包的位置
2. Cmd:nuget spec yourownstuff,以此新建spec文件
3. spec文件中删除不必要的信息,添加dependencies和metadata外部的files;如果是.net6,则file标签的tartget属性,路径必须为lib\net6.0
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata>
<!-- 标题 -->
<id>Zhao</id>
<!-- 版本 -->
<version>1.0.0</version>
<!-- 作者 -->
<authors>Dejana Tesic, Rajeev Dey</authors>
<!-- 说明 -->
<owners>dejanatc, rjdey</owners>
<!-- URL 链接 -->
<projectUrl>https://docs.microsoft.com/zh-cn/nuget/</projectUrl>
<!-- 许可证信息 -->
<license type="expression">Apache-2.0</license>
<!-- 图标 -->
<icon>image.png</icon>
<!-- 如果为true,则此值会提示用户在安装软件包时接受许可证。 -->
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<!-- 关于这个特定版本的任何细节 -->
<releaseNotes>增加了什么功能</releaseNotes>
<!-- 说明 -->
<description>干什么用的</description>
<copyright>版权</copyright>
<!-- 标记搜索关键字 -->
<tags>牛 哈哈</tags>
<!-- 依赖包 -->
<dependencies>
<group targetFramework=".NETFramework4.8">
<dependency id="Newtonsoft.Json" version="13.0.1" clude="Build,Analyzers" />
<dependency id="SharpZipLib" version="1.3.3" clude="Build,Analyzers" />
</group>
</dependencies>
<!-- 依赖框架程序集 -->
<frameworkAssemblies>
<frameworkAssembly assemblyName="Microsoft.CSharp" rgetFramework=".NETFramework4.8" />
<frameworkAssembly assemblyName="PresentationCore" rgetFramework=".NETFramework4.8" />
</frameworkAssemblies>
</metadata>
<!-- 重点,DLL XML PNG TXT 文件 -->
<files>
<file src="D\dll\readme.dll" target="\readme.dll" />
<file src="D\dll\readme.xml" target="\readme.xml" />
<file src="D\image\image.png" target="\image.png" />
</files>
</package>
4. Cmd:nuget pack yourownstuff.nuspec,以此生成yourownstuffversion.nupkg
5. C#项目中安装此本地nupkg,nuget包管理器-设置- nuget包管理器-程序包源-加号增加-省略号选择路径-更新,以此设置本地包路径
6. 可将.targets文件生成于build路径下,实现在引入包时的附加操作,下面是一段复制操作:
<Project>
<Target Name="CopyFile" BeforeTargets="Compile">
<Copy SourceFiles="$(MSBuildThisFileDirectory)..\Path\xxxx.dll"
DestinationFolder="..\$(Configuration)\Path\"/>
</Target>
</Project>
具体BeforeTargets、AfterTargets、Compile、Build、Pack太多,我记不清。.targets文件的文件名必须和包名一致。
7. 完成安装
注:1. nuget包中打包的dll所需的另外的dll,不能放在files中引用进来,需要将另外的dll放在本地包路径下,并在nuspec的dependencies中进行添加(正在验证中,好像放在files中也可)
2. buildTransitive和targets写错后程序无法编译,先不要修改csproj,尝试将debug下obj文件夹删除
3. nupkg包卸载后再次安装,无论本地包的内容是否变更,只要其version没有变,则都会安装第一次的nupkg包的内容,这是因为C:\User\Name\.nuget\packages\packagename\version\下有缓存
4. 包中某些dll默认包管理格式为Packages.config时,会报出“请确保此文件可访问并且是一个有效的程序集或COM组件”,导致当前及后续dll打包失败;默认包管理格式为PackageReference时则不会
仅本地路径,且尚未涉及MsBuild,后续会补充。
参考:https://www.cnblogs.com/zhaoxf-nx-pm-csharp-vb-381160500/articles/15717624.html