如何管理第三方asemblies在(nuget-)一致的方式?(How to manage thir

2019-10-29 17:40发布

或:如何自动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依赖关系检查的代码库级依赖 - 但这种方法

  1. 由数百至少百兆腹胀与每一个版本的更新回购,从第一天开始
  2. tideous搞清楚的依赖性的层次结构,并确定所需要的组件
  3. 容易出错,当涉及到从例如GAC到所述依赖关系的目录重新参考组件
  4. 风格断路器在“现代”依赖关系管理“的方式的NuGet”的意义

据我所知,许可,关注不断库供应商通过公共的NuGet发布他们的组件摆在首位饲料,但这种风格的不一致在管理引用完全吸收。 (一般的NuGet和包管理器的崛起说足够依赖管理的“传统方法”)

即使这些供应商最终决定支持“原生”包在未来referenceing自己的东西,仍然是有关传统-app的如使用旧版本的库的问题。

当然还有的选项设置我们的开发机器作为生成代理。 但是,这对我们来说是无解的,因为我们的项目是相当长的,生活在支持感,我们的开发机器相比是种脆弱的(这些easyly获得一年消灭至少一次,如果不是更经常在这里和那里。我们的项目往往需要如后五位建甚至在更长的待用期间(5),甚至十(10)年)。

我想很多你们和女生的出他们正面临着类似的问题,expecially在更大的机构单位。

要解决这个问题的方法之一是maually工艺的NuGet-包这个库。 这限制使得assembliey-hierarchie的意义“一个计时器”的tideous工作(每库版本至少)和“神奇”需要照顾的组件 - “再引用”的,但也容易出错(在至少在各自nuspec的创作时间)和一个真正的(真正的)痛苦的事,特别是当它涉及到新库的版本,它往往带有更多的依赖)

你怎么乡亲解决这些类型的问题? Isn't有什么事都来自动完成这个?

Answer 1:

是的,肯定是有办法。

介绍TeGun

从TeGun github上的存储库 :

TeGun(的NuGet逆转)是一个简单的,但方便的跨平台(.netcore)命令行的实用工具,用于从一堆普通的,无包装的组件创建的NuGet包(nupkg)。 主要目标是与不来通过例如Nuget.org包装第三方组件打交道时提供快速模具的经验。

刚点(dotnet-)tegun,包含第三方组件的目录。 TeGun将扫描组件,分析它们的依赖,创造**。* nuspecs他们,尊重内部的依赖,防止包装与它“复制/冗余”组件。

您可以影响naming-和包的版本控制方案,并通过通配符模式甚至预先定义捆包装,捆绑如主题组件的UI组件。

这有助于至少在初始创建的* .nu​​specs产生的**。* 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拥有我,当我发现的时候(捐助接受;)工作)。



文章来源: How to manage third-party asemblies in a (nuget-) consistent way?