寻找 msbuild 和 xbuild 任务来获取引用的库(没有 nuget.exe)

本文关键字:没有 nuget exe 引用 msbuild xbuild 任务 获取 寻找 | 更新日期: 2023-09-27 18:35:18

我在为我的构建系统创建基于单声道的简单解决方案时遇到问题。

目前的情况是我将引用的库保存在 git 存储库中,这并不好,原因很多。

我想要实现的是NuGet提供的东西 - 自动从Web下载dll,将它们放在某个目录中并忘记它们。

我想在构建时执行此操作,因此下载库等不需要任何其他操作。最好的选择是msbuild(xbuild on mono)任务,但我希望它是独立于系统的,所以流行的执行NuGet.exe是毫无疑问的(考虑并行单声道安装等)。

我尝试过Pepita项目,但它是...错。不,真的,它是,它有太多的设计错误,易于使用或维修。要进行正确的配置,需要对整个项目进行认真的重写。

想要的是一个库,它将采用NuGet.Core库并作为任务提供。如果没有这样的库,我可以使用任何解决方案,这将下载一个 nuget 包并将其解压缩到 .csproj 中指定的目录。

更好的是,如果这样的库可以解析依赖项而无需在packages.config(或类似)文件中明确指定它们,那就太好了,例如,如果我想包含Castle.Windsor,我不想在我的配置文件中包含Castle.Core。

我知道 OpenWrap 项目(使用 NuGet Gallery),它看起来很有前途,但我找不到解决方案,我只会在我的存储库中放置一组恒定的库,修改 csproj 文件,一些配置并完成它。

寻找 msbuild 和 xbuild 任务来获取引用的库(没有 nuget.exe)

我可以告诉你,OpenWrap的核心内置了一切,可以做你想做的事。你可以用openwrap-shell做的所有事情都可以从msbuild调用。所以,在我看来,你只需要添加一个构建前的钩子来调用 openwrap 来执行"更新包装"。几个月前,我实际上考虑做类似的事情。AFAIR 我实际上编写了一个 msbuild 脚本来调用 openwrap 任务,但并没有真正将它们挂接到正常的构建过程中。

我不知道你说的"在你的仓库中放一组恒定的库一次"到底是什么意思?对于 OpenWrap,您需要做的就是维护项目的"openwrap 描述符"。该文件包含项目的所有直接依赖项(对版本号有或没有限制)。(间接依赖项会自动拉入)您是否想知道当您有一堆二进制 dll 开始时如何开始?我可以告诉你我做了什么。基本上,我不使用任何NuGet包,我为所有内容创建了OpenWrap包。我还为我们所有的二进制依赖项(其中一些是开源的)创建了 OpenWrap 包。这真的很简单:你在 OpenWrap 描述符中填写正确的依赖项,并指定包必须只包含给定的 dll。我们有一堆二进制依赖项,但是一旦你开始打包它们,它肯定不是那么多工作。

如果你想看一个例子,你可以看看这个:http://code.google.com/p/ppwcode/source/browse/dotnet/External/Apache.Log4Net/trunk/Apache.Log4Net.wrapdesc

这就是打包二进制依赖项所要做的全部工作。这是我创建的软件包,我们目前在我工作的公司中使用它。我知道 Log4Net 可能作为 NuGet 包提供,我可能会使用它。自己创建这些二进制包的好处是,我可以完全控制包,包的版本号,大项目如何拆分为几个较小的包等等。

作为 OpenWrap 存储库,您可以使用本地文件系统上的文件夹或网络共享上的文件夹。我们使用的,实际上是一个webdav存储库,我们将其本地挂载在驱动器上(使用Windows 7)。这对我们来说效果很好,还允许我们指定谁对存储库具有读写访问权限。

你提到单声道...好吧,这可能是一个问题:当前发布的OpenWrap(2.0.2)版本无法在单声道AFAIK上运行。但好消息是,Sebastien Lambla一直在努力让OpenWrap在mono + xbuild上运行,以用于即将发布的新版本:2.0.3。目前还没有可用的 alpha/beta 构建,但您可以从 git 构建。(在这种情况下,您需要同时构建 openwrap-shell 和 openwrap)。创建OpenWrap的Sebastien Lambla通常会关注StackOverflow上的问题,并且可能会给你一个关于单声道状态的更完整的答案。

顺便说一句,在我工作的地方,我们已经使用OpenWrap一年多了。当时我们比较了NuGet和OpenWrap,当时OpenWrap远远领先于NuGet。基本上,对我来说,NuGet 不是用于依赖项管理的工具,而是一个帮助您在 Visual Studio 中从远程服务器拉入二进制依赖项的工具(意思是:将 dll 从远程服务器复制到本地文件夹,并在项目文件中添加对本地 dll 的引用)。与此同时,NuGet一直在追赶OpenWrap,并添加了OpenWrap中已经存在的功能。在我看来,NuGet 在 OpenWrap 上只有 2 件事,那就是 Visual Studio 中的集成(又名远程可用包的概述和包的单击-单击-单击添加)以及它由Microsoft维护的事实 (AFAIK)。这两件事都只是政治性的:通过漂亮的界面和微软的支持更容易说服人们。然而,就我个人而言,我认为OpenWrap在技术上是优越的,我认为它没有得到应有的关注真的很遗憾。