【问题标题】:Assuming I have Identical source code, do I have to rebuild the code?假设我有相同的源代码,我是否必须重建代码?
【发布时间】:2014-01-16 03:49:53
【问题描述】:

假设我有一个“构建服务器”和一个“开发机器”,它们都具有以下特征

  • C# 编译器
  • 相同的源代码
  • 相同的系统环境变量
  • 相同的编译器和编译器标志
  • 构建服务器和开发机器上的架构相同

我还从Eric Lippert's blog 了解了以下关于 C# 编译器的内容(我使用的是 .NET,但可以针对任何静态语言构建过程提出这个问题)

  • C# 编译器的设计不会两次生成相同的二进制文件
  • 从根本上说,C# 编译器为您完成的工作是接收 C# 代码,分析其正确性,并生成以 PE 格式编写的等效程序
  • 编译器优化和多线程编译器是不确定的
  • JIT 将在运行时更改代码

知道这一切。

如果我在构建服务器上构建源代码并获得一组 DLL 和可执行文件,我称之为 server binaries

在我的开发机器上重建二进制文件不是多余的,即构建local binaries

server binarieslocal binaries 不是彼此的有效替代品吗?

如果是这样,我可以复制所有的 server binaries ... 但它们在 local binaries 会消失的地方,并将它们视为我自己构建的。

显然,在只有 1 台开发机器的情况下这似乎没有必要,但如果我有 n 开发机器,我只需构建一次,而不是 n 次。

我的逻辑有明显的缺陷吗?这是 .Net 商店的常见做法吗?

【问题讨论】:

    标签: compiler-construction msbuild build-process binary-compatibility


    【解决方案1】:

    是的,原则上在您的机器上重建它们是多余的。但是您的问题不够具体,并且有多种可能的情况会产生不同的答案。

    例如,如果您有基本的实用程序库,它们不经常更改并且保存在单独的解决方案中,那么这些显然是让服务器构建它们然后被使用的候选者。但是请记住,简单地复制二进制文件可能很乏味且容易出错。每次更改代码时都必须这样做。你必须为它写一个脚本。如果您需要调试功能,您还必须复制 pdb 文件并在您的开发机器上拥有相同的源代码。在这种情况下,让 NuGet 为您管理它可能会很方便。像这样的另一种情况:如果整个项目非常大但足够模块化,以至于单个开发人员或他们的团队可以在项目的单独部分上工作,而不需要其余部分的完整源代码。如果他们不必费心构建他们不必处理的项目部分,他们将获得时间,而可以从服务器中提取一个工作版本。

    另一个典型场景是您的解决方案包含一堆逻辑上属于一起的项目。就像主 ui 项目、具有应用程序逻辑的底层项目、插件项目等。虽然原则上可以再次让服务器为您构建其中的一些项目,但这完全没有意义,而且完全不切实际(请注意这里的一些缺点也可能适用于上述情况,因为有时在简单的实用程序库和许多项目严重依赖的东西之间没有明确的界限):修改源代码后,您必须将更改推送到服务器,然后等待它构建,然后复制结果。这是浪费时间。特别是因为您的服务器可能需要很长时间才能生成构建结果,因为它会在所有可能的配置中构建/测试所有内容。此外,默认情况下,VS 会覆盖您刚刚复制的二进制文件,因此您必须卸载项目或找出其他方法使其不这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 2014-03-09
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多