问题标签 [incremental-build]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1443 浏览

gradle - 使用类路径中的文件时,Gradle 中的增量编译不起作用

我正在尝试为我们的项目建立类似 maven 的依赖管理的某种支持。为此,我将要继承的 pom 添加为 buildscript 中的类路径依赖项。我编写了一个插件,它添加了一个任务“继承”,该任务将文件作为输入并解析它并将来自该 pom 的依赖项放入映射中。该任务是在插件的 apply 方法中启动的,我从类路径中获取 pom。

在插件的 apply 方法中,我添加了任务并使编译依赖于它:

在其他一些时候,我遍历我的依赖项并根据我从 pom.xml 获得的版本更改版本。

这一切似乎都奏效了。但是 compileJava 永远不会是最新的。它总是需要重新编译。我做错了什么还是 gradle 看不到类路径文件没有改变?

问候,阿恩

0 投票
1 回答
1260 浏览

scala - 可以为 CI 构建关闭 sbt 中的增量编译器吗?

在寻找一种方法来改善我们的构建服务器上的编译时间时,我遇到了这个关于增量编译器增加的开销的问题。由于我们的构建服务器每次都会检查源代码的新副本并从头开始构建,因此能够完全禁用增量编译器并且不必为不会使用的东西付费会很好。这可能吗?

0 投票
0 回答
275 浏览

c++ - Visual Studio 2012,发布与调试,增量构建

我正在通过 IDE 在 Visual Studio 2012 中构建一个 C++ 项目。我有两种配置 Debug 和 Release,平台设置为 x64。

当我触摸项目中的 .cpp 文件并在 Debug 配置下构建时,只有该 .cpp 文件被再次编译为 .obj 文件,即其他 .cpp 文件不会再次编译。这是我所期望的行为。

但是,在 Release 配置下,如果我触摸 .cpp 文件,项目中的所有 .cpp 文件都会重新编译。

当我只更改了一个不相关的 .cpp 文件时,我在 Release 配置中看不到停止编译其他 .cpp 文件的标志或设置。有人知道我需要更改才能使其正常工作的设置吗?

编辑:抱歉,我在发布后注意到 Properties -> General -> Whole Program Optimization 在 Release 版本中没有设置为 No Whole Program Optimization,这导致所有 .cpp 文件在每个版本上重新编译。

谢谢。

0 投票
1 回答
917 浏览

msbuild - 如何避免构建和部署没有代码更改的依赖项

我正在做一个关于持续集成的概念验证,以及我们的开发团队是否会从自动化构建和自动化部署中受益,以减少人为错误。我已经在这个过程中走了很远,但是对于如何配置我们的增量构建以避免重建没有代码更改的依赖项有一些问题。此外,我希望我们的部署工具能够仅识别和部署由于代码更改而重建的程序集。

我们已经使用 TFS 等 Microsoft 产品进行源代码控制,使用 Visual Studio 进行开发,使用 Team Foundation Build 进行持续集成构建。我们目前倾向于使用 InRelease 进行部署,因为它似乎与 Team Foundation Build 很好地集成。

但首先,这是我们当前的设置......

  1. 有 200 多个 C# 解决方案文件,每个文件包含一个或多个项目。在环境中将这些项目组合成较少的解决方案(即通过设计)是不切实际的。解决方案中的项目使用项目引用来解决对其他解决方案中项目的依赖关系和文件引用。据我所知,这是微软在处理大量项目时推荐的方法。

  2. 我们使用“按功能分支”策略,例如在并发功能分支上进行隔离开发,完成后合并到一个稳定的主分支。当需要发布时,发布会从主发布分支并隔离用于修补程序和部署。功能分支和主分支具有由代码签入触发的 CI 构建。发布主要是从 InRelease 对选定的发布分支手动执行。一个版本将通过各种环境部署,包括集成/测试、UAT,并最终部署到我们所有的客户。我们仍在充实分支策略的细节,但这是另一个问题。

目前要解决的问题:

1.避免重建没有代码更改的依赖项...

当我们向客户端部署新功能或补丁时,我们希望将文件中的绝对最小化。我们公司拥有庞大的客户群(数千名客户),有时互联网连接速度很慢,因此无法为每个客户全面部署所有组件(200 多个)。我通过设置增量构建部分解决了这个问题,该构建只正确重建了预期的更改项目,但也重建了所有依赖项目,即使没有对它们进行任何代码更改。这导致更改的程序集和依赖项都具有新的时间戳。如果我们使用时间戳的更改来识别要部署哪些程序集,那么这将导致部署功能未更改的程序集。

例如:

解决方案 B,有一个名为 Project B 的项目 解决方案 A,有一个名为 Project A 的项目

项目 B -> 项目 A(其中项目 A 对项目 B 有文件依赖关系)

当在项目 A 中进行非破坏性更改时,例如对方法的内部进行更改,那么预期的结果是:只构建了 A,因此是部署的候选者。当在项目 A 中进行重大更改时,这将破坏项目 B,预期结果是:A 和 B 都已构建,因此是部署的候选者。目前 MSBuild 无论如何都会重建所有依赖项,这不是我们想要的。

2.自动识别应该部署哪些程序集...

我对这个问题有部分解决方案。执行构建时,我的构建过程模板被配置为运行 MSBuild 脚本,其中包含以特定顺序构建的解决方案列表。此操作在构建代理的工作区中执行。每次执行新构建时,构建过程模板都会创建一个唯一的放置文件夹,格式为并将二进制文件从构建代理工作区复制到放置文件夹。这是标准构建过程模板处理的开箱即用功能。构建已配置为不清除构建代理工作区,因此它第一次运行时将构建解决方案中的所有项目,但后续构建将仅构建具有代码更改或依赖于其他项目的项目(增量构建?)。因此,未更改的程序集将具有原始时间戳,而更改的程序集将具有新的时间戳。我们有一个工具可以在放置文件夹之间进行文件夹比较并将结果输出到 txt 文件。这使我们能够识别自上次部署以来添加/更改/删除了哪些二进制文件。它还为我们提供了额外的好处,即将实际人工制品列表与开发人员定义的预期人工制品清单进行比较。这将确保不会部署尚未指定和证明经过单元测试的程序集。

问题是我们如何利用 InRelease 仅根据上面的示例部署所需的文件,而不是放置文件夹中的所有文件?

0 投票
1 回答
220 浏览

jenkins - 谁能帮我理解如何在 Jenkins 中进行增量构建?

我正在使用 gradle 并想在 jenkins 上进行增量构建,我不知道如何继续,如果有人可以建议我一些好的文档或正确的方法来继续。

非常感谢

0 投票
1 回答
312 浏览

visual-studio - 如何通过更新现有应用程序在设备上部署 WP8 应用程序(在现有应用程序上增量安装)

我已经使用 Windows Phone 8 模板创建了一个 Windows Phone 项目。

如果我第一次在设备中部署,那么它会在 VS 输出窗口中显示以下日志:

  • 正在连接到设备...
  • 优化设备...
  • 正在安装应用程序...
  • 正在更新与已安装文件相关的信息...

这很好用。现在我正在更新应用程序的本地数据库(sqlite 数据库)中的一些数据,然后我再次清理解决方案并重建应用程序,它在 VS 输出窗口中显示以下日志:

  • 正在连接到设备...
  • 优化设备...
  • 该应用程序已安装在设备上。检查是否可以进行增量部署...
  • 在清理和重建项目时进行全面部署......
  • 正在卸载应用程序...
  • 正在安装应用程序...
  • 正在更新与已安装文件相关的信息...

最近的安装覆盖了我现有的应用程序数据(sqlite db 数据),但我不想“卸载应用程序... ”。我只更新了应用程序。 我不想在更新前卸载应用程序。

你能告诉我是什么问题吗?以及如何在更新很少更新的新应用程序时维护现有的数据数据库和本地缓存。

我正在使用 Visual Studio 2013,项目类型:Windows Phone,模板:Windows Phone App。

任何帮助/建议/意见将不胜感激。

谢谢,

0 投票
0 回答
190 浏览

scala - shapeless break sbt 增量编译

我有一个使用 sbt 13.5 构建的 scala 项目。

由于我使用 shapeless 实现了一个模块,因此每当 sbt 尝试增量编译项目时,它都无法解决所需的隐式:

[...] 找不到参数映射器的隐含值 [...]

[...] 找不到参数文件夹的隐含值 [...]

等等。

sbt cleansbt compile解决了这个问题,但项目相当大,这反过来又痛苦地减慢了编译时间和我的生产力,因为新构建可能需要几分钟。

知道这里发生了什么吗?


一些额外的信息

所以,经过一番思考,我做了一些假设。使用无形记录时会出现此问题,通过查看生成的文件,我认为为每个记录键生成单例类型的宏可能存在问题。

HList我的模块需要ColParser[T, K]声明为:

所以编译器Witness为每个ColParser使用宏生成一个,我担心 sbt 在决定重新编译什么时会丢失生成的宏,但这只是一个粗略的假设。

事实上,每当我更改调用我的模块的代码中的某些内容(例如,我ColParser从 中添加/删除 a HList)时,我都会收到上述错误。强制重新编译模块(通过删除生成的.class)解决了这个问题。

0 投票
1 回答
686 浏览

c# - ResolveAssemblyReference 缓慢——msbuild 速度?

我有一个项目,其中可能有 200 多个项目。这是一只老鸟。为了使本地构建更快,我运行了诊断构建。似乎解决程序集和项目引用需要 msbuild 一段时间。VS 似乎做得很快,有没有办法让 MSBuild 为这些引用使用缓存,或者以某种方式更快地解决它?

似乎 MSBuild 不需要经常通过增量构建来解决程序集引用,对吧?

有没有办法让 MSBuild 为此报告其内部依赖关系树?

0 投票
1 回答
1504 浏览

git - Jenkins如何仅在发生更改时按计划触发构建

在我们的 Jenkins 和 git 设置中,master 是 Windows,slave 是 Linux。(在接下来的几个月中的某个时候将全部更改为 linux)。

当您在作业中设置轮询 SCM 时,轮询操作发生在主设备上,而不是作业配置为运行的从设备上。无论如何..服务器配置有问题,我无法在那里运行 git 并通过 SSH 到达另一台机器上的 repo。

net,在服务器修复之前,我无法使用 poll scm。

但是,我有一个构建作业需要在发生更改时运行,因为它构建了用于自动部署应用程序以进行进一步测试的工件。我可以使用 Build Regularly,但它会每 30 分钟构建一次(仅作为示例),并且每晚和周末构建一次,而且大多数情况下这是浪费时间。

所以,我想创建一些定时工作,检查一些东西,看看自上次以来是否有变化。构建仅针对特定分支中的内容发生。

我“认为”我可以使用 rev-list 来获取最后一次提交,但我只想要特定分支中的提交。然后我可以把它保存到一个文件中,然后重新检查下一个副业。

如果修订不匹配,则触发其他工作。

有人有更好的指导吗?

0 投票
1 回答
6144 浏览

command-line - 使用 MSBuild.exe 进行增量构建

我正在通过 Python 构建一个 Visual Studio 2010 解决方案,并调用 subprocess。当直接从命令行调用时,devenv.com 大约需要 15 秒才能启动。但是当从 Python 调用时,它会跳转到 ~1.5 分钟。

自然,我希望从我们的构建中删除那个死时间。所以我决定测试 MSBuild.exe(来自 .NET 4)。看起来 MSBuild.exe 会立即运行。但是......它似乎每次都进行完整构建,而不是增量构建。

我正在使用的命令是

看起来这应该支持增量构建。但是我在网上看到帖子表明 msbuild 可能无法支持这样的增量构建。

这可能吗?如果是这样,我做错了什么?

更新:

我已经阅读了更多。基于

http://msdn.microsoft.com/en-us/library/ms171483.aspx

http://www.digitallycreated.net/Blog/67/incremental-builds-in-msbuild-and-how-to-avoid-break-them

似乎我需要在我的 .vcxproj 文件中设置输入和输出属性。检查我的文件,这些确实丢失了。

它们什么时候生成?我的大多数 .vcxproj 文件都是从 Visual Studio 2008 转换而来的。但我还生成了一个新项目,该项目也缺少输入和输出属性。

VS2010 不创建具有这些属性的项目吗?

更新:我们已经升级到 VS 2013。现在 msbuild 支持增量构建。从未深入了解 VS 2010 问题。