包管理器在Linux世界中是再平常不过的东西了,用于从各种来源中获取依赖。优秀的包管理器提供了统一的方式来获取程序库和应用,同时还会得到正确版本 的依赖,我们不用担心这些程序库和依赖的来源,包管理器会帮我们打点好一切。对于Ruby程序员来说,使用最多的包管理器是RubyGems;在Perl 世界中则是CPAN module,它位于Comprehensive Perl Archive Network。
对于.NET开发者 来说却没有这样一个利器。即便只使用微软自己的组件,所需的程序库也散布在微软众多的站点和其他一些依赖站点如SourceForge和CodePlex 上。随着人们对非微软项目(如Castle Windsor和NHibernate等)信任度的不断提升,这些问题也逐步得到了解决。
Sebastien Lambla在Progressive.NET的演讲中介绍了OpenWrap:以二进制形式管理依赖的项目。Robert Pickering总结了OpenWrap的使用方式:
包以zip形式存放在中央服务器上。OpenWrap提供了一个DSL,这样你就 可以指定使用哪个包、哪个版本了(其所用的语法非常灵活,可以指定最小和最大的版本号)。OpenWrap提供了一套msbuild目标,这样就可以将基 于DSL的描述插入到构建过程中了,当然,这里指的是Visual Studio。接下来,这些msbuild目标会负责下载所需的项目并将依赖存储在本地机器上的中央缓存中,这个中央缓存能够提供项目构建所需的引用。
OpenWrap 并非.NET生态圈中首个包管理器,最近发布的Bricks项目的目标也是如此,不过Bricks项目目前只提供了命令行工具,此外还有WebGAC,奇 怪的是它还需要用到Apache。
由于OpenWrap还处在孵化期,因此很多地方都需要手工编辑项目文件才能调用OpenWrap而非 C#编译器。通过在“包装描述器”中列出依赖,OpenWrap能自动下载必要的DLL并添加到项目中。由于引用关系是由OpenWrap管理的,因此他 们并不会出现在解决方案管理器的引用文件夹中。
包是基于ZIP格式的,这种文件格式对于Windows程序员是耳熟能详的,此外,由于将 头信息存储在文件末尾,因此它的可扩展性也是非常棒的;因为这部分空间是无用的,因此可以存放数字签名信息。