惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
Spread Privacy
Spread Privacy
V
Visual Studio Blog
爱范儿
爱范儿
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
V2EX
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale
N
Netflix TechBlog - Medium
B
Blog RSS Feed
博客园 - 【当耐特】
有赞技术团队
有赞技术团队
The Register - Security
The Register - Security
Latest news
Latest news
The Cloudflare Blog
Project Zero
Project Zero
月光博客
月光博客
U
Unit 42
Vercel News
Vercel News
Attack and Defense Labs
Attack and Defense Labs
Know Your Adversary
Know Your Adversary
V
Vulnerabilities – Threatpost
F
Full Disclosure
Schneier on Security
Schneier on Security
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
L
Lohrmann on Cybersecurity
C
CERT Recently Published Vulnerability Notes
博客园 - 叶小钗
腾讯CDC
博客园 - 三生石上(FineUI控件)
T
The Blog of Author Tim Ferriss
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - Franky
S
Security Affairs
Hacker News: Ask HN
Hacker News: Ask HN
Security Latest
Security Latest
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
MongoDB | Blog
MongoDB | Blog
D
DataBreaches.Net
SecWiki News
SecWiki News
Recorded Future
Recorded Future
NISL@THU
NISL@THU
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cloudbric
Cloudbric

博客园 - wsky

为WebClient增加Cookie支持 keepalived安装和使用 NHibernate分享 PPT 开源选型关注点 SocketAsyncEventArgs stunnel+haproxy SSL以及问题记录 快速实现一个简单的bigpipe模型 Velocity2010大会回顾 小结一下关于bpm实施方面的交流 乱弹之企业应用 互联网企业流程部门价值方向的一些探讨 Live Writer的代码插件 再谈团队,项目,产品 【渐进】设计一个模拟并行的线程同步组件 【渐进】关于反向代理,负载均衡 【渐进】浅尝DDD,对"试卷"建模 【渐进】延迟加载机制的简易实现(上) - wsky - 博客园 略谈“开发效率” 分工,协作,团队
生产环境使用Nuget
wsky · 2011-09-18 · via 博客园 - wsky

关于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服务器构建的时候就比较麻烦了,不能再同一个位置管理包

这个问题在它的官方已经有人在问了,估计下几个版本会有动作

以下提供一些解决上述问题或实际应用时的一些方法

下述范例所在目录结构:

image

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投入项目环境使用的相关准备工作:)