背景
标题说不清楚,所以有必要来说明一下我的意图。现在公司使用unity来做类似 容器插件化 的设计,即一个unity工程会在运行时根据时机加载不同的小app,这些小app都是一个单独的项目,全部使用 ILRuntime 来实现。于是就会有一个问题,每当需要创建一个小app的时候,都需要创建一个单独的 C# 库工程(ILRuntime使然),这样每次都会去依赖一些unity相关的dll,比如 UnityEngine.dll 、 UnityEngine.coreModule.dll 等等,然后每次都要找到这里dll,手动Add Reference,一两次还可以接受,但是次数多了,确实很烦躁。且手动添加不易于管理, 比如:我们开始的时候用的原生的assetbundle来做资源管理,后来改用addressable,那么就需要添加addressable的相关dll。如果之前已经开发了蛮多小app,就要挨个手动添加。而且,你手动添加完了,并不代表团队里别人也ok了,他们也要自己手动搞一遍。是不是很刺激。于是就有何不把这些依赖搞成一个 nuget 的 package的念头。来一个项目,直接在 visual studio 里的 Manage NuGet Packages 面板里添加我们做好的package即可。日后需要增删改dll,只要维护这一个package就好了。
付之以行动
生成一个nuget package 可以有三种方式,dotnet 、nuget、MSBuild。 本文使用的是 nuget 生成方式。大概步骤如下:
- 准备依赖的dll
- 生成 .nuspec 文件
- 编辑 .nuspec 文件
- 终端运行命令 nuget pack命令来生成 .nupkg 包
- 把包上传 nuget.org
- 在visual studio 添加我们生产的nuget package
1. 准备dll
这步就是要把我们ILRuntime要用到的dll整理到一个目录里,比如下图是我整理的
整理的好处主要是后面编辑 .nuspec 文件的时候有个取巧的地方。
2. 生成 .nuspec 文件
这步只要在终端运行 nuget spec 命令即可得到一个 .nuspec 文件, 但是里面的内容都是默认,还需要进一步编辑,添加我们需要的东西进去。
3. 编辑 .nuspec 文件
关于 .nuspec 文件,官方文档有很详细的解释 here
这里说下对于我这个想法一个关键的地方
画红框部分,就是我们要添加的依赖dll,有几个添加几个, 路径可以是绝对路径,也可以是相对于 .nuspec 文件的路径。
如果在第一步整理的好话(即整理的文件夹里都是我们想要依赖的dll),就可以像上面一样用 *.dll 来包含所有的dll,而不用一个一个写。
4. 终端运行命令 nuget pack命令来生成 .nupkg 包
如果以上3步都准备好了,到这就可以直接调用命令来生成 nuget package 了。下面是我使用的命令
nuget pack Package.nuspec -properties Configuration=Release
等待命令执行完成,就会在 .nuspec 同级目录生成一个 .nupkg 的包了。命令参数可以参照 官方文档
5. 把包上传 nuget.org
接下来就是把我们生成的包上传到 nuget.org 。需要注册一个微软账号并登录即可上传。
6. 在visual studio 添加我们生产的nuget package
最后一步了,经过上一步上传成功后,需要等待大概2、3分钟,打开 visual studio 的nuget package 管理器,搜索我们上传的package名字,就可以看到我们刚刚生产的package了。
点击右下角的 Add Package 按钮,即可添加到我们的 ILRuntime 项目里, 之后就像往常一样使用就行了。
我的是mac系统, 如下:
windows 的大家自己找找这个面板。