在源代码和预编译的二进制文件之间切换

塔尔莫·皮卡罗

我们的应用程序中有大量的库。库用c ++或c#编写。(平台:.net框架,Windows,64位)将所有内容编译为源代码需要花费大量时间。我们曾考虑过切换到预构建的二进制文件,但我们仍然希望能够返回到源代码。作为我们使用git的版本控制系统,构建可以通过azure devops完成。可以根据需要设置任何自定义服务器。

存在哪些用于软件包管理的现成工具,以及可以在源代码和预构建二进制文件之间轻松切换的可能性?(如果工具与两种编程语言都不兼容-可以只为一种语言指定工具集是可以的。)如果不存在这样的工具,则您会自己推荐什么-使用哪种包装,要编写哪种脚本那一个的顶端?

是否可以识别Api / abi断裂?

塔尔莫·皮卡罗

这个问题有多个方面-源代码构建,程序包安装,外部存储库,api / abi中断,构建系统本身。

首先您的要求-您是否只对包装和/或安装感兴趣?

包装本身有可能下面的包装系统中使用,例如:nuget, conan, vcpkg, choco

您很有可能不仅会发布包本身,而且还会为它们调试符号感兴趣。

对于azure devops / debug符号,可以从以下链接中找到发布文档:

https://azure.microsoft.com/zh-CN/blog/deep-dive-into-azure-artifacts/ https://docs.microsoft.com/zh-cn/nuget/create-packages/symbol-packages- up

目前,柯南(C ++包装)不支持符号发布:https : //github.com/conan-io/conan/issues/4047

为了获得源代码分发,可以使用git本身。Git子模块确实允许创建外部git存储库引用,但是一旦添加了外部子模块,就需要使用double commit更改所有内容-一个git commit到子存储库,一个git commit更新主存储库中引用的git hash。

确实存在一些解决此问题的方法,例如:不带子模块的嵌套git:

没有子模块的嵌套git存储库?

=>

http://debuggable.com/posts/git-fake-submodules:4b563ee4-f3cc-4061-967e-0e48cbdd56cb

但是,如果您使用预构建的二进制文件而不是源代码来构建主存储库-在理想的解决方案中,您不需要该外部git存储库,这也意味着不需要git clone / checkout外部存储库。

然后,也可以有一个all-in-one solution或多个解决方案,每个解决方案都是单独编译的。

确实更容易拥有all-in-one solution,因为依赖解决方案编译的麻烦更少。

为了实现完全动态的解决方案生成,例如可以使用cmake-它可以根据cmake中使用的预配置选项生成解决方案。(请参阅cmake的"option")。

cmake确实是C ++(支持预编译头文件,加快了统一编译速度)的不错选择,但对于C#来说可能不是那么简单(很难找到必要的参数来正确配置它)。

目前(5.2020)尚未找到替代cmake的更好方法,但是与cmake并行发展的是多种工具和生态系统,因此需要观察未来可能会带来什么。

然后关于包装。choco似乎是nuget的子集-它使用自己的支持软件更新的xml标签扩展了nuspec。(推荐的网页:https : //chocolatey.org/,https : //docs.microsoft.com/en-us/nuget/reference/nuspec

如果您要发布nuget包甚至安装程序包,则可以使用nuget存储库(无需任何额外费用)。

如果不足以满足您的需要,也可以将nuget服务器升级到choco服务器,但是可能要花一些钱-请参阅巧克力般的网页。

在实际发生编译/链接错误或应用程序在运行时崩溃之前,无法在任何级别上观察到Api / abi中断-唯一可行的替代方法-是控制包装本身的版本控制-因此主程序包nuget(或choco)版本需要更高版本的从属nuget(或choco)版本。

如果主存储库由子存储库由同一个人开发-那么api / abi中断可以由开发人员自己完成,但是如果两个gits彼此独立并且由不同的团队开发-那么api / abi中断可以在以下任何时刻发生时间。

确保存储库一致的最佳方法-在主存储库上进行单元测试,这将检查是否没有api / abi中断。

从理论上讲,如果api / abi中断-构建系统本身可以继续使用两种构建替代方案-

  1. 在主存储库之后跟上一个工作子存储库
  2. 跟随子存储库而不构建主存储库

可以通过使用分支来应用相同的机制,例如

  1. “主git:主分支” +“子git:版本/1.0分支”
  2. “子git:主分支”

这种机制可能不仅需要观察两个存储库,而且还需要观察分支,以防持久故障。(例如,子git的开发团队并不关心主git中发生的构建中断)

怀疑没有任何现成的工具可用于此目的(如果会出现,请发表评论),因为这可能需要重新连接来自两个可能不同的构建链,来自不同的git存储库,来自不同的组织的工具。

最后,但并非最不重要的一点-如果您希望您的应用程序具有软件更新功能-则nuget / choco发行版下载可与其他nuget / choco服务器一起使用。

这是nuget包的下载部分的好示例:https : //github.com/mwrock/NugetDownloadFeed

安装软件包的构建是一个更为复杂的问题-例如,请参见以下链接:

(以我的意见为最佳)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

yum是否可以从源代码进行编译而不是安装预编译的二进制文件?

下载预编译的二进制文件 libtensorflow.so 和 libtensorflow_framework.so

正确的方式包含与预编译的二进制文件和手动编译的二进制文件不同的头文件

如何针对源代码和仅二进制包编译Go程序?

读取二进制文件时切换字节序

压缩不包括二进制文件的源代码

从源代码编译一个新的二进制文件后,旧的二进制文件会怎样?

从单个C源代码生成库和二进制文件

UEFI固件软件代码(已编译的二进制代码和源代码)保存在哪里?

Ubuntu是从源代码上在其回购中编译其所有非专有软件包,还是使用开发人员的预编译二进制文件?

µWebSockets的编译失败,并且没有预编译的二进制文件

在预编译阶段编译的二进制文件不适用于临时容器

Java读取串行端口在运行时在文本模式/二进制模式之间切换

在本地发布SBT的预编译X二进制文件

如何从 AWS Lambda 上的预编译二进制文件导入 lxml?

将预编译的二进制文件捆绑到电子应用程序中

Prometheus用于Mac OS X的预编译二进制文件

使用Linux预编译二进制文件的Java / JNI的Vowpal wabbit

YOCTO (dunfell) 安装预编译二进制文件的正确方法

snapcraft.yaml语法,用于预编译的二进制文件

为什么许多项目不提供预编译的二进制文件?

我在哪里存储预编译的二进制文件?

mysql的源代码和二进制发行版之间有什么区别

二进制文件和BLOB之间的区别

相同的Java源代码可编译为二进制不同的类

Linux内核手动构建:生成的二进制文件比预编译的二进制文件大10倍

如何更新二进制数的一位作为切换?

C ++二进制搜索树切换语句问题

如何使用GLFW预编译二进制文件编译Visual Studio 2019版本构建