问题标签 [parallel-builds]
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.
java - 防止ant依赖被并行调用多次
背景:我有一个构建过程,它编译 java 代码并使用已编译的类构建两个 jar(每个 jar 都是不同的子集,一些类都出现在两者中)。
现在,我被要求用户能够单独构建每个 jar,但也能够并行构建它们(因为它大大减少了总构建时间)。
所以我想出了一个结构如下的脚本:
问题是,当使用“all-jars”目标时,“compile”目标会被执行两次。有没有标准的方法来防止它?更好的是,有没有使用 antcall 的替代方法?
PS我在这里发现了一个类似的问题,但没有给出答案。
jenkins - 你可以拥有多少个 Jenkins Executor?
我正在与 Jenkins 运行并行测试。
我设置它的方式是我有一个构建流程作业,它并行执行三个其他作业。其他三个作业连接到单独的测试 XML 文件。
当我最初开始这个时,我遇到了一个问题,即只有两个作业会同时执行,第三个作业只有在其他一个作业完成后才会执行。
我发现这是因为我的 Jenkins 将执行者的数量设置为2
,现在设置为5
。
但是,出于兴趣,只是为了未来的规划,Jenkins 是否对您可以拥有的 executor 数量设置了上限?或者有一个你不应该超过的推荐数字?还是完全取决于您运行它的环境?
如果有上限/建议数量不超过?我认为解决这个问题的最佳方法是使用主/从方案并将工作负载分散到多个虚拟机上。
例如,如果我将其设置为 6 个执行程序,这是否意味着我将在每个 VM 上拥有 6 个执行程序?还是在虚拟机之间共享 6 个执行程序?
cmake - 从 CMake setup 'make' 到默认使用 '-j' 选项
make -j N
每当我make
从终端调用时,我希望我的 CMake 项目由 构建。我不想-j
每次都手动设置选项。
为此,我将CMAKE_MAKE_PROGRAM变量设置为特定的命令行。我使用这个ProcessorCount()
函数,它给出了并行执行构建的处理器的数量。
当我这样做时make
,我看不到任何加速。但是,如果我这样做make -j N
,那么它的构建速度肯定会更快。
你能帮我解决这个问题吗?(我正在 Linux 上开发这个。)
这是我使用的代码片段CMakeList.txt
:
非常感谢。
msbuild - MSBuild - 尝试构建项目引用时的竞争条件
我在尝试使用 MSBuild 构建时遇到了一个奇怪的问题。
我正在使用 MSBuild 构建解决方案文件,其中 /m(并行构建)和 BuildProjectReferences 设置为 true。假设我在 sln 文件中有 A.vcxproj 和 B.vcxproj,B 有一个对 A 的项目引用。发生的情况是 A 项目首先开始构建,而在编译过程中,B 项目开始在另一个进程中构建(因为并行构建),它会调用构建 A。现在这会导致竞争条件,因为我们有两个进程试图构建同一个项目 A,我会看到访问问题。
理想情况下,如果 A 尚未完成构建,或者如果它确实调用 B 然后检测到 A 仍在构建并等待它完成,则 MSBuild 不应调用构建 B。这一切都不会发生。此外,这仅在 MSBuild 中发生 - 如果我尝试从 VS2015 IDE 构建解决方案文件,则不会发生。
知道为什么 MSBuild 会这样吗?
makefile - 限制子制作中的并发性
对于分布在多个子目录中的项目,我们使用 GNU make 进行构建。开发人员可以使用该-j <number>
标志来并行化构建任务,并选择一个适合他们机器硬件的数字。
但是,我们使用的第三方库的 Makefile 并行化并不安全——它们显然依赖于目标的隐式顺序,而不是所有依赖目标之间的显式依赖规则。
由于我不想修复第三方 Makefile,我们目前使用显式-j 1
参数调用他们的 Makefile,以将构建该库的作业数限制为 1。规则如下所示:
这可以按需要工作,但是,make 会为此发出警告:
这导致我在这里询问是否有更好的方法来限制一个子制作中的并行作业数量。
cmake - CMake中生成的文件的运行时依赖关系
我有一个测试(add_executable(MyTest ...)
),它在运行时需要一个文件。该文件是使用自定义命令生成的。我想在 CMake 中对运行时依赖项进行建模。
目前,使用where is a custom target对生成的文件存在构建时依赖关系,该目标依赖于自定义命令的输出。缺点:在构建完成之前不会开始编译代码。这是不必要的——我想并行构建和生成文件。add_dependencies(MyTest GenerateFile)
GenerateFile
MyTest
GenerateFile
MyTest
我考虑的另一个选择是添加一个新目标MyTestAndGenerateFile
,该目标同时依赖于MyTest
和GenerateFile
。缺点:调用make MyTest
不再生成文件。一个人必须记得打电话make MyTestAndGenerateFile
。
或者,可以调用新目标MyTest
并使用add_executable(MyTest_Code ...)
. 缺点:使用 Visual Studio 生成器时,测试代码现在将位于名为MyTest_Code
而不是的项目中MyTest
,这违反了命名约定。此外,您现在必须构建项目,MyTest
但运行项目,MyTest_Code
因此您不能再使用设置为启动项目。
简而言之,我正在寻找一种add_dependencies
说法,即在构建时不需要依赖项,而是在运行时需要。
maven - maven 多线程构建导致 OverConstrainedVersionException
我正在使用 maven-3.2.3 ,maven-depedency-plugin-3.0.2
所有maven-assembly-plugin-3.0.0
这些都是线程安全的,但是在使用 4 个线程运行 maven build 时
( mvn clean install -T 4
),
我断断续续地打
org.apache.maven.artifact.versioning.OverConstrainedVersionException
如果我尝试用单线程构建它,这永远不会发生,(mvn clean install
)
这是错误的堆栈跟踪
gradle - 并行化 GNU Makefile 等 gradle 任务
我遵循了https://guides.gradle.org/using-the-worker-api/中的教程并让示例正常工作。总结:它是关于 gradle 运行中任务的并行化,从 4.0 版开始支持,并且 gradle 团队显然认为他们有一个不错的解决方案。
相比之下,这是 Makefile 所做的(为了比较,使用相同的路径):
如您所见:我还添加了 sha256 任务(Makefile“语言”中的目标)。all 目标的依赖关系树如下所示:
级别 3 中的所有目标(文件名目标)并行执行,当调用 withmake -j 6
或更高时,结果时间为 3 秒(与睡眠)
相比之下,扩展的 build.gradle:
不能很好地扩展。它有两个可并行化的任务,每个任务并行处理 3 个文件,因为这些任务旨在执行此操作,但 gradle 不够聪明,无法并行化这两个任务 md5 和 sha256,即使它们完全独立。所以得到的时间是 6 秒 (2*3)
现在:对于更复杂的场景,我需要链接更多不同的操作并将它们并行化。例如 10 个稍微不同的依赖包->上传->远程构建任务链,它们应该全部并行运行,直到一切就绪,然后继续进行非并行测试。
在 GNU make 中,这一切都没有问题,但是我们的开发团队只使用 Java,他们不喜欢使用 15 年历史的纯二进制工具来完成看起来像是 gradle 的工作的想法。
真的没有机会在 gradle 中设置这种类型的并行化吗?