最近在做一个Xamarin for android的项目,有个需求是一次可以从相册中选择多张图片,但是 android API<19 的版本还不支持一次选择多张图片,在网上找了一下,发现原生的组件有很多并且都非常好用,也找到了很多原生的通过Binding 技术生成的 Xamarin for android的组件但是,都不好使,有的是Glide 版本冲突,我本身项目也是使用了Glide的(Glide 的每一个版本的升级,API的变化都很剧烈,上一个版本的方法在下一个版本里甚至没有过度就直接去掉了), 还有就是V4包和V7包冲突,搞得人很郁闷, 后来想将java原生的Binding一个来用,从网上直接下载下来的jar 或者 aar包,通过Binding项目创建出来dll后引进去所有设置都完成了,发现还是出现了各种包依赖的问题,用不了。 如果要想创建出来能用的Binding项目就需要对原项目使用的依赖和自己项目当前用的依赖包进行对比,并重新编译生成新的jar或者arr文件然后再Binding才可以, 但是一个问题来了,如果以后我的项目的相关依赖包升级了,那么相关的包又会和现在Binding的包有冲突。 最后决定将Java原生的组件移植一个.Net 的版本。于是就将AwesomeImagePicker 这个组件移植了一份。源码可以在这里下载, 下面是几张screenshot,
我想把我写的这个组件分享给他人使用,最好的方法就是放在www.nuget.org上,那么下面就进入正题:怎么创建一个.nupkg?
1. 安装NuGet环境
在https://www.nuget.org/downloads下载最新的NuGet.exe, 放到本地机器的某个位置。然后在环境变量Path 。
比如我将nuget.exe 刚在 C:\nuget\nuget.exe. 那么Path环境变量里配置是这样子的:
然后在命令行中输入nuget 输入如下信息则说明nuget已经安装配置成功.
2、创建需要打包的Xamarin 类库项目
打开VS 2017, 选择 File->New->Project…打开项目创建窗口。然后在该窗口选择 Installed->Visual C# –> Android –> Android Class Library(Xamarin).
然后给项目起个名字:Xamarin.Droid.ImagePicker, 如下图所示:
点击 OK 按钮创建项目,成功后,在VS2017中看到的项目长这样子:
这下就可以在这里封装你的类库了。
3、创建 .nuspec file
打开Package Manager Console 窗口输入如下命令:
PM> nuget spec Xamarin.Droid.ImagePicker
提示:
在当前的solution中创建一个soluton 文件夹,然后把刚刚创建的 文件 Xamarin.Droid.ImagePicker.nuspec 包含进来,便于进行编辑, 双击nuspec文件,初始的文件长这样:
xml version="1.0"?> <package > <metadata> <id>Xamarin.Droid.ImagePickerid> <version>1.0.0version> <authors>michaelauthors> <owners>michaelowners> <licenseUrl>http://LICENSE_URL_HERE_OR_DELETE_THIS_LINElicenseUrl> <projectUrl>http://PROJECT_URL_HERE_OR_DELETE_THIS_LINEprojectUrl> <iconUrl>http://ICON_URL_HERE_OR_DELETE_THIS_LINEiconUrl> <requireLicenseAcceptance>falserequireLicenseAcceptance> <description>Package descriptiondescription> <releaseNotes>Summary of changes made in this release of the package.releaseNotes> <copyright>Copyright 2018copyright> <tags>Tag1 Tag2tags> <dependencies> <dependency id="SampleDependency" version="1.0" /> dependencies> metadata> package>
编辑文件,将相应的信息替换成实际的信息如下:
xml version="1.0"?> <package > <metadata> <id>Xamarin.Droid.ImagePickerid> <version>1.0.0version> <authors>michaelauthors> <owners>michaelowners> <licenseUrl>https://github.com/Xushlin/xamarin-ImagePicker/blob/master/LICENSElicenseUrl> <projectUrl>https://github.com/Xushlin/xamarin-ImagePickerprojectUrl> <iconUrl>https://visualstudio.microsoft.com/wp-content/uploads/2016/05/[email protected]iconUrl> <requireLicenseAcceptance>falserequireLicenseAcceptance> <description> Xamarin android image picker, support picker one or more images at once.description> <releaseNotes>First relase only support picker picker image from Album.releaseNotes> <copyright>Copyright 2018copyright> <tags>xamarin android image-pickertags> <dependencies> <dependency id="Glide.Xamarin" version="4.0.0" /> <dependency id="Newtonsoft.Json" version="11.0.2" /> <dependency id="Xamarin.Android.Support.Design" version="25.4.0.2" /> <dependency id="Xamarin.Android.Support.v7.AppCompat" version="25.4.0.2" /> dependencies> metadata> package>
这里加上了相关的依赖包,以及一些作者的相关信息。
4、生成 .nupkg
上面的设置都做好以后,在Package Manager Console 窗口输入如下命令:
PM> nuget pack Xamarin.Droid.ImagePicker.nuspec
但是报下面一个错误:
于是在网上找了一下,发现在NuGet的官方Github WIKI https://github.com/NuGet/Home/issues/7020下面发现了一个OPEN的 Issues, 看来这个还真是有Bug,但是也有收获,有位开发者的回复中说在VS 外面运行命令是可以的。
于是启动了一个命令行,在命令行下运行下面的命令:
G:\git\xamarin-ImagePicker\src\Xamarin.Droid.ImagePicker>nuget pack Xamarin.Droid.ImagePicker.csproj
这下成功了:
G:\git\xamarin-ImagePicker\src\Xamarin.Droid.ImagePicker>nuget pack Xamarin.Droid.ImagePicker.csproj
Attempting to build package from 'Xamarin.Droid.ImagePicker.csproj'.
MSBuild auto-detection: using msbuild version '15.7.179.6572' from 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\bin'.
Packing files from 'G:\git\xamarin-ImagePicker\src\Xamarin.Droid.ImagePicker\bin\Debug'.
WARNING: NU5115: Description was not specified. Using 'Description'.
WARNING: NU5115: Author was not specified. Using 'michael'.
Successfully created package 'G:\git\xamarin-ImagePicker\src\Xamarin.Droid.ImagePicker\Xamarin.Droid.ImagePicker.1.0.0.nupkg'.
在Xamarin.Droid.ImagePicker 目录下面生成了 Xamarin.Droid.ImagePicker.1.0.0.nupkg
但是注意命令中有几个重要参数要注意:
-IncludeReferencedProjects 表示当前打包的项目的所有引用项目也会一起打包到当前的nupkg中来。
-properties Configuration=Release 表示当前是在Release 环境中打包,如果不带这个参数选项默认情况下是在Debug环境中打包。
-symbols 这个参数选项表示你打的这个包,使用者可以在调试Debug环境下进入你的源码,带这个参数后会生成两个包:一个带-symbols后缀的。nupkg包,长得像这样子。
Xamarin.Droid.ImagePicker.1.0.0.nupkg
Xamarin.Droid.ImagePicker.1.0.0.symbols.nupkg
所以我使用 的命令是:
nuget pack Xamarin.Droid.ImagePicker.csproj -IncludeReferencedProjects -properties Configuration=Release -symbols
5、测试 nupkg
包创建好了就要做一些测试工作,先将包存放在电脑上的一个位置, 我是存在 C:\LocalPackage 中。
然后创建测试项目,我创建的测试项目:
创建完测试项目后开始进行包的引用, 使用NuGet package 管理器。右键单击测试项目-> Manage NuGet Packages…
打开包管理器界面,然后点击包管理器右上角的设置
打开包管理器的选项设置界面,在这个界面上点击添加按钮,会在Package Resouce 列表里新添加一项:
选中新添加的那一项,修改Name 为“LocalPackage”(这个名字随便起)。 并将Source 改为你本地存储.nupkg 的路径,我这里是C:\LocalPakage
如下图:
然后点击“Update'”按钮:
最后点击 “OK”按钮回到包管理器界面,在右上角 选择Package resource 为刚刚配置的LocalPackage,这样左边窗口就出现了本地的.nupkg
点解Install按钮将包就添加到项目中来了:
6、分享.nupkg
测试完成后就可以将包发布到nuget.org 了,其他的开发人员就可以在包管理器中查找到你开发的组件或者类库了。进而使用到项目中。