生产环境使用Nuget
关于Nuget http://nuget.org/
官方提供的使用文档比较丰富 http://docs.nuget.org/
要在实际生产环境使用它来做打包和包管理,比之更为成熟的Maven来说,从目前版本来看稍有不足,主要是以下几点:
packages.config的继承和解决方案中的识别
比如:
1: nuget update xx.sln
2: nuget update packages.config
它做的事只是对比包得版本是否有更新并更新之,只要版本没有变化,即使本地仓库没有这个包也不会去下载它,而
1: nuget install packages.config
只能指定具体的config文件,不能通过一个sln件自动去扫描解决方案里的所有packages.config
和build的集成度:
类似上面一点,build的时候不会对本地仓库不存在的必备依赖去自动获取
nuget虽然提供 -build参数,但是仅是使用了MSBuild,本身的构建描述能力缺乏(所以下文在生产环境使用会搭配NANT来完成构建过程),而maven中则比较完整的集成了这个过程
repository的安装位置不可配置:
默认情况下package的安装目录是在.sln所在的目录下建立一个packages目录,也就是说是solutionfile级别的,这个对于项目数量多的时候是比较难接受的,本地开发还好,在build服务器构建的时候就比较麻烦了,不能再同一个位置管理包
这个问题在它的官方已经有人在问了,估计下几个版本会有动作
以下提供一些解决上述问题或实际应用时的一些方法
下述范例所在目录结构:
http://ops-base/feeds/ 是自己hosting的一个nuget feed(http://docs.nuget.org/docs/creating-packages/hosting-your-own-nuget-feeds)
创建包描述文件:
1: <?xml version="1.0"?>
2: <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
3: <metadata>
4: <id>Package.Castle</id>
5: <version>2.1</version>
6: <title>Castle</title>
7: <authors>Castle</authors>
8: <owners />
9: <requireLicenseAcceptance>false</requireLicenseAcceptance>
10: <description>
11: IOC容器
12: </description>
13: <copyright>2011</copyright>
14: <language>zh-CN</language>
15: </metadata>
16: <files>
17: <file src="Castle\Castle.Core.dll" target="lib\net40\Castle.Core.dll" />
18: <file src="Castle\Castle.Core.xml" target="lib\net40\Castle.Core.xml" />
19: <file src="Castle\Castle.DynamicProxy2.dll" target="lib\net40\Castle.DynamicProxy2.dll" />
20: <file src="Castle\Castle.DynamicProxy2.xml" target="lib\net40\Castle.DynamicProxy2.xml" />
21: <file src="Castle\Castle.MicroKernel.dll" target="lib\net40\Castle.MicroKernel.dll" />
22: <file src="Castle\Castle.MicroKernel.xml" target="lib\net40\Castle.MicroKernel.xml" />
23: <file src="Castle\Castle.Windsor.dll" target="lib\net40\Castle.Windsor.dll" />
24: <file src="Castle\Castle.Windsor.xml" target="lib\net40\Castle.Windsor.xml" />
25: </files>
26: </package>
批量打包和发布到feeds,pack.bat脚本如下:
1: echo off
2: mkdir assembly\packages
3: echo pack
4: forfiles /p assembly /m *.nuspec /c "cmd /c ..\tools\nuget pack @file -outputdirectory packages"
5: echo push
6: forfiles /p assembly\packages /m *.nupkg /c "cmd /c ..\..\tools\nuget push @file -s http://ops-base/feeds/ hello1234"
7: echo on
批量安装和更新本地package,nuget.install.bat脚本如下:
1: echo off
2: echo install
3: forfiles /s /m packages.config /c "cmd /c %1\nuget install @file -o %2"
4: echo update
5: forfiles /s /m packages.config /c "cmd /c %1\nuget update @file -source http://ops-base/feeds/nuget"
6: echo on
然后使用NANT然完成构建过程,nant.build部分内容如下:
1: <?xml version="1.0"?>
2: <project name="infrastructure" default="build">
3: <property name="project.config" value="release" dynamic="true" />
4: <!--path-->
5: <property name="dir" value="."/>
6: <property name="dir.tools" value=".\tools"/>
7: <property name="build.base" value="build\${project.config}"/>
8: <property name="build.absolutepath" value="${path::get-full-path(build.base)}" />
9: <!--msbuild-->
10: <property name="msbuild" value="C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe" />
11: <property name="msbuild.config" value="Debug" dynamic="true"/>
12: <if test="${project.config=='Release'}">
13: <property name="msbuild.config" value="Release"/>
14: </if>
15: <property name="msbuild.params"
16: value="/t:rebuild
17: /p:Configuration=${msbuild.config}
18: /p:AllowUnsafeBlocks=true
19: /t:ResolveReferences" />
20: <property name="msbuild.params.weboutput" value="/t:_CopyWebApplication /p:WebProjectOutputDir=${build.absolutepath}" />
21: <property name="msbuild.params.output" value="/p:OutputPath=${build.absolutepath}" />
22: <!--nuget-->
23: <property name="nuget" value="${path::get-full-path(dir.tools)}" />
24: <property name="nuget.packages" value="${dir}\packages" />
25: <property name="nuget.install" value="${dir}\nuget.install.bat" />
26: <property name="nuget.params.install" value="${nuget} ${path::get-full-path(nuget.packages)}" />
27:
28: <!--build infrastructure-->
29: <target name="base" description="Infrastructure">
30: <exec program="${nuget.install}" commandline="${nuget.params.install}" workingdir="${dir}" />
31: <exec program="${msbuild}"
32: commandline="${msbuild.params} ${msbuild.params.output}"
33: workingdir="${dir}\Infrastructure\" />
34: </target>
35: </project>
上述nant脚本中,target=base的构建目标就是要构建的项目了,首先执行nuget.install.bat脚本更新本地packages,然后执行msbuild
然后运行下述脚本执行构建:
1: .\tools\nant\bin\nant base
到这里就完成了将nuget投入项目环境使用的相关准备工作:)