gpt4 book ai didi

scala - Scala的Ant FSC任务速度

转载 作者:行者123 更新时间:2023-12-03 12:00:12 25 4
gpt4 key购买 nike

我有一个用于编译我的scala项目的ant文件。我正在使用fsc,它可以避免我的core 2仅加载编译器需要2到3秒的时间。
我的问题是:据我所知,ant fsc任务确实招致相同的2〜3秒的罚款。这很烦人,因为有专门用于此原因的fsc。更麻烦的是,它实际上是开始时间,而不是处理时间,因此即使没有任何重新编译的时间,我也必须在fsc任务上等待3秒。每次,它都会变得越来越糟。

我的调查似乎表明,大多数时间都花在阅读scala-compiler.jar上。确实,scalacfsc任务需要这样做是有道理的,因为它们直接运行编译器。此外,从ant任务的类路径中删除scala-compiler.jar会导致该任务因缺少依赖项而失败。
从逻辑上讲,fsc任务仅连接到我想的编译守护进程,因此它不需要该依赖关系,但我想它与实现方式有关(fsc任务继承自scala任务)。也许它将在下一版本中发布。

我目前正在寻找的解决方案是,将fsc任务重写为Apply任务,然后手动调用fsc。那我就不会耽搁了。很遗憾,必须手动重做scala随附的任务专门处理的工作。

有没有人有这个问题的经验?我的分析有什么问题吗?您能提出比我计划实现的解决方案更好的解决方案吗?

供引用,这是我的任务的样子(是的,它编译了一个android项目):

<target name="compile-scala" description="Compile scala files">
<taskdef resource="scala/tools/ant/antlib.xml" classpath="${scala-library.jar}:${scala-compiler.jar}" />
<mkdir dir="${out.classes.absolute.dir}" />
<fsc encoding="utf-8" deprecation="on" destdir="${out.classes.absolute.dir}">
<src>
<dirset dir="." includes="src"/>
<dirset dir="." includes="gen"/>
</src>
<classpath>
<pathelement location="${android.jar}" />
<fileset dir="${sdk.dir}/tools/lib" includes="*.jar" />
</classpath>
</fsc>
</target>

编辑:这是应用任务的样子。它似乎有效。但是,这是非常不令人满意的,因此问题仍然存在。
<target name="fast-compile-scala"
description="Compile scala files without loading the compiler inside ant">
<mkdir dir="${out.classes.absolute.dir}" />
<apply executable="fsc" failonerror="true" parallel="true">
<arg value="-encoding" />
<arg value="utf-8" />
<arg value="-deprecation" />
<arg value="-dependencyfile" />
<arg value="${out.classes.absolute.dir}/${scala.deps}" />
<arg value="-g:vars" />
<arg value="-d" />
<arg value="${out.classes.absolute.dir}" />
<arg value="-make:transitivenocp" />
<arg value="-classpath" />
<arg value="${android.jar}:${out.classes.absolute.dir}" />
<!-- <arg value="-optimize" /> -->
<!-- <arg value="-verbose" /> -->
<!-- <arg value="-explaintypes" /> -->
<fileset dir="src" includes="**/*.scala" />
<fileset dir="src" includes="**/*.java" />
<fileset dir="gen" includes="**/*.java" />
</apply>
</target>

再次编辑:
上面的作品,但我发现它有一个相当严重的局限性。当文件数量增加时,上述任务会受到参数数量和/或命令行长度的限制。在具有良好 shell 的linux或mac OS下,您可以走很长一段路而不会碰到这堵墙,但是在Windows下,要防止此问题仅需几个文件。添加一个选项以将文件指定为相对路径而不是绝对路径可以使您感到有些喘不过气。根据依赖关系将文件拆分为几个命令不是一个现实的选择,因为这是一项繁重的任务,每当文件结构发生更改时都需要进行更新。因此,尽管对于小型项目,以上内容大部分可以解决问题,但对于任何规模可观的项目都无济于事...

最佳答案

希望这对您有帮助:

第一种情况(fsc ant任务)

当您启动ant时,会加载一个全新的JVM,其中会加载scala-compiler.jar
jar 的加载是由于<taskdef resource="scala/tools/ant/antlib.xml" classpath="${scala-library.jar}:${scala-compiler.jar}" />行而不是classpath部分。

第二种情况(ant启动命令行)

正如您概述的那样,这仅限于文件很少的简单项目。最大命令行长度:Windows XP-> 8191,Linux / OSX->内核值(通常> 100000)
顺便说一下,您在此处生成了两个JVM(一个用于ant,另一个用于fsc)。由于它使用缓存,因此在您的测试中可能更快。

建议的解决方案

在maven中,目标scala:cc(连续编译)将编译器保留在内存中,并连续扫描文件以进行修改。如果您不想将生成器更改为Maven,则可以编写一个执行相同操作的新ant任务(fscc:快速Scala连续编译器)

关于scala - Scala的Ant FSC任务速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com