或:如何自动nuspec / nupkgs创造?
TL; DR;
我们的项目团队需要上不存在的NuGet的程序包管理许多第三方库,用(当然)许多基于的NuGet依赖性一起。 We'd喜欢在大多数的NuGet一致的方式来管理这些依赖关系,但手工制作nuspecs kindof很烂。 我们怎样才能为我们的第三方依赖自动化的NuGet的程序包的创建?
背景
我们公司的项目团队正在使用我们的许多项目,对于没有公开可用的NuGet的程序包存在,如DevExpress的DevExtreme控制库,或类似的某些第三方库。
我们经常会遇到困难,建立持续集成(CI)/ - 部署(CD)等的管道,这些项目,我们的构建剂(一种“协同定位 - 预置”的Team Foundation Server(TFS)ATM)往往缺乏所需的组件/为了成功打造这些项目的组件。 这往往利兹unsuccessfull建立设立时新建剂(如移动到一个新的TFS版本时)或设立新的项目时。 在组件的西服tideous安装这进一步的结果,以便大部分时间,甚至在不同版本的相应的库和“基准摆弄”的的负荷,以支持建筑物(传统)的应用程序。
此问题已得到解决了传统的大部分时间由手工管理中来,例如,通过在代码存储库根“依赖” -folder依赖关系检查的代码库级依赖 - 但这种方法
- 由数百至少百兆腹胀与每一个版本的更新回购,从第一天开始
- tideous搞清楚的依赖性的层次结构,并确定所需要的组件
- 容易出错,当涉及到从例如GAC到所述依赖关系的目录重新参考组件
- 风格断路器在“现代”依赖关系管理“的方式的NuGet”的意义
据我所知,许可,关注不断库供应商通过公共的NuGet发布他们的组件摆在首位饲料,但这种风格的不一致在管理引用完全吸收。 (一般的NuGet和包管理器的崛起说足够依赖管理的“传统方法”)
即使这些供应商最终决定支持“原生”包在未来referenceing自己的东西,仍然是有关传统-app的如使用旧版本的库的问题。
当然还有的选项设置我们的开发机器作为生成代理。 但是,这对我们来说是无解的,因为我们的项目是相当长的,生活在支持感,我们的开发机器相比是种脆弱的(这些easyly获得一年消灭至少一次,如果不是更经常在这里和那里。我们的项目往往需要如后五位建甚至在更长的待用期间(5),甚至十(10)年)。
我想很多你们和女生的出他们正面临着类似的问题,expecially在更大的机构单位。
要解决这个问题的方法之一是maually工艺的NuGet-包这个库。 这限制使得assembliey-hierarchie的意义“一个计时器”的tideous工作(每库版本至少)和“神奇”需要照顾的组件 - “再引用”的,但也容易出错(在至少在各自nuspec的创作时间)和一个真正的(真正的)痛苦的事,特别是当它涉及到新库的版本,它往往带有更多的依赖)
你怎么乡亲解决这些类型的问题? Isn't有什么事都来自动完成这个?
是的,肯定是有办法。
介绍TeGun
从TeGun github上的存储库 :
TeGun(的NuGet逆转)是一个简单的,但方便的跨平台(.netcore)命令行的实用工具,用于从一堆普通的,无包装的组件创建的NuGet包(nupkg)。 主要目标是与不来通过例如Nuget.org包装第三方组件打交道时提供快速模具的经验。
刚点(dotnet-)tegun,包含第三方组件的目录。 TeGun将扫描组件,分析它们的依赖,创造**。* nuspecs他们,尊重内部的依赖,防止包装与它“复制/冗余”组件。
您可以影响naming-和包的版本控制方案,并通过通配符模式甚至预先定义捆包装,捆绑如主题组件的UI组件。
这有助于至少在初始创建的* .nuspecs产生的**。* nuspecs既可以进一步tweeked,以满足您的需要或使用外的开箱通过NuGet.exe,模具生产消费品包装。 从上,你可以自由地决定了你吃这道他们(像一个本地网络共享或的NuGet进纸),并创建包例如基于更新的库是一件轻而易举的事。
TeGun's最初的版本后,我共创造了1200包几乎重量机械1.5 GB的大型组件套件,它跨越了5个主要版本,在30分钟内(从这段时间,TeGun本身在做的大部分工作) 。 而这只是一个图书馆的一个供应商。
我甚至设法创建一个从上通过的NuGet包,探险家主要版本到另一个主要版本upgdrade包和另一个变体“锁定”的主要版本,但是从Package Explorer中尊重供应商的更新(只是因为我可以,因为我们的一些项目都是那种关于eG的UI组件套装的重大版本升级precautios的)
这样,包提供了一种“快速圈”,并在库更新意义上的“慢环”。
样品
此示例也可以在GitHub
Let's假设我们有一个应用程序,做了一些MS Office的自动化。 因此,它需要从Office-SDK的某些组件。 我们确定了一堆可用的组件,并将它们复制到c:\ TEMP \ officeSDK。 该目录的内容可能看起来像他的:
- Microsoft.Office.Interop.OneNote.dll
- Microsoft.Office.Interop.Outlook.dll
- Microsoft.Office.Interop.OutlookViewCtl.dll
- Microsoft.Office.Interop.PowerPoint.dll
- Microsoft.Office.Interop.Publisher.dll
- ...
为了调用TeGun,我们利用DOTNET CLI扩展点的描述在这里 。 所以let's创建启用TeGun项目
dotnet new tegun
dotnet restore
这将创建一个项目,一个DotNetCliToolReference实际TeGun-可执行文件,它在还原时将下载
TeGun使用大多数的it's设置的配置文件自动柜员机(见#1 )。 Let's初始化一个新的配置有:
dotnet tegun init office
这西港岛线创建一个指向当前目录组件的初始office.config.json。
打开config来调整包创建您的需求:
{
"assemblies": {
"sources": [
"." //scan the local directory for assemblies
],
"excludePatterns": [
"System.*" //exclude matching assemblies
],
"bundles": [
{
"searchPattern": "Microsoft.Office.*", //Bundle all matching assemblies
"packageId": "OfficeBundle.Sample", //into a package
"packageVersion": "1.2.3.4" //with this version
}
],
"substitutions": [
{
"replace": "Interop",
"with": "xxx"
},
]
},
//general nuspec-creation settings
"package": {
"authors": "earloc",
"owners": "earloc",
"tags": [ //additional tags
"tags",
"go",
"here"
],
"targetframeworks": [
"net45"
],
"versionFormat": "{Major}.{Minor}.{Build}.{Revision}", //Use full version number from scanned assembly as package version
"title": {
"prefix": "earloc.", //prefix package names
"suffix": ""
},
"nuspecTemplate": null
}
}
如果我们现在调用命令:
dotnet tegun nuspec office
TeGun将根据子文件夹办公室/ nuspecs上面的设置创造nuspec-文件:
- OfficeBundle.Sample.1.2.3.nuspec
- earloc.Microsoft.Office.xxx.OneNote.14.0.0.nuspec
- earloc.Microsoft.Office.xxx.Outlook.14.0.0.nuspec
- earloc.Microsoft.Office.xxx.OutlookViewCtl.14.0.0.nuspec
- earloc.Microsoft.Office.xxx.PowerPoint.14.0.0.nuspec
- earloc.Microsoft.Office.xxx.Publisher.14.0.0.nuspec
- ...
这些nuspecs现在可以进一步调整,以您的需求,可用于生产包装,例如在办公室子文件夹一个简单的批处理文件:
set nuget=nuget.exe
for /R nuspecs %%f in (*.nuspec) do (
%nuget% pack %%f -OutputDirectory packages
)
会产生在办公室/包以下软件包:
- OfficeBundle.Sample.1.2.3.nupkg
- earloc.Microsoft.Office.xxx.OneNote.14.0.0.nupkg
- earloc.Microsoft.Office.xxx.Outlook.14.0.0.nupkg
- earloc.Microsoft.Office.xxx.OutlookViewCtl.14.0.0.nupkg
- earloc.Microsoft.Office.xxx.PowerPoint.14.0.0.nupkg
- earloc.Microsoft.Office.xxx.Publisher.14.0.0.nupkg
- ...
限制
TeGun不支持自动列入卫星组件自动取款机,但it'sa拥有我,当我发现的时候(捐助接受;)工作)。