يعيد FSC في كل مرة
-
25-09-2019 - |
سؤال
تقوم FSC بإعادة ترجمة ملفات .scala الخاصة بي في كل مرة حتى لا توجد حاجة - يمكنني تجميعها مرتين دون تحرير أي شيء بين المحاولات وإعادة تنسيقها! على سبيل المثال ، لدي ملفان
مرحبا
class Hello{
print("hello")
}
و Tokens.Scala:
abstract class Token(val str: String, val start: Int, val end: Int)
{override def toString = getClass.getSimpleName + "(" + "[" + start + "-" + end + "]" + str + ")"}
class InputToken(str: String, start: Int, end: Int)
extends Token(str, start, end)
class ParsedToken(str: String, start: Int, end: Int, val invisible: Boolean)
extends Token(str, start, end)
عندما أطلب من ANT تجميع المشروع من نقطة الصفر ، أرى الإخراج التالي:
ant compile
init:
[mkdir] Created dir: D:\projects\Test\build\classes
[mkdir] Created dir: D:\projects\Test\build\test\classes
compile:
[fsc] Base directory is `D:\projects\Test`
[fsc] Compiling source files: somepackage\Hello.scala, somepackage\Tokens.scala to D:\projects\Test\build\classes
BUILD SUCCESSFUL
من لا أقوم بتحرير أي شيء وأطلب مجموعة النمل مرة أخرى:
ant compile
init:
[mkdir] Created dir: D:\projects\Test\build\classes
[mkdir] Created dir: D:\projects\Test\build\test\classes
compile:
[fsc] Base directory is `D:\projects\Test`
[fsc] Compiling source files: somepackage\Tokens.scala to D:\projects\Test\build\classes
BUILD SUCCESSFUL
كما ترون ، يعمل FSC ذكيًا في حالة Hello.scala (بدون إعادة ترجمة) ويتصرف غبي في حالة الرموز. أقترح أن المشكلة مرتبطة بطريقة ما بالميراث ولكن هذا كل شيء.
إذن ما هو الخطأ؟
المحلول
لا أحب الكثير من الأشياء النشر التي كتبها الآخرين ، لكنني أعتقد أن هذا السؤال يستحق إجابة أكثر اكتمالا والتي تم طرحها بدقة.
لذلك ، بادئ ذي بدء ، fsc
يعيد كل شيء بشكل افتراضي ، الفترة. أنه ant
, ، ليس fsc
, ، الذي يغادر Hello.scala
خارج ، لأن اسم الملف يطابق اسم الفصل. لا يغادر Tokens.scala
خارج لأنه لا يوجد فصل يسمى Tokens
تم تجميعه - لذلك ، في غياب أ Tokens.class
, ، تم إعادة ترجمة Tokens.scala
.
هذا هو الشيء الخطأ الذي يجب فعله مع سكالا. يختلف Scala في جانب واحد أساسي من Java في ذلك ، بسبب القيود الفنية على JVM ، تغيير في أ trait
يتطلب إعادة تجميع كل فئة أو كائن أو مثيل يستخدمه.
الآن ، يمكن للمرء إصلاح ant
مهمة القيام بشيء أكثر ذكاءً بدءًا من Scala 2.8. أنا آخذ هذه المعلومات من blogtrader.net بواسطة Caoyuan ، من Scala Plugin لشهرة NetBeans. يمكنك تحديد مهمة Scala على هدف البناء كما أدناه:
<scalac srcdir="${src.dir}"
destdir="${build.classes.dir}"
classpathref="build.classpath"
force="yes"
addparams="-make:transitive -dependencyfile ${build.dir}/.scala_dependencies"
>
<src path="${basedir}/src1"/>
<!--include name="compile/**/*.scala"/-->
<!--exclude name="forget/**/*.scala"/-->
</scalac>
انها تخبر ant
لإعادة ترجمة كل شيء ant
ببساطة ليس ذكيًا بما يكفي لمعرفة ما الذي يجب إعادة ترجيفه أم لا. كما يروي سكالا لإنشاء ملف يحتوي على تبعيات تجميع ، واستخدام خوارزمية التبعية المتعدية لمعرفة ما الذي يجب إعادة تنظيمه أم لا.
تحتاج أيضًا إلى تغيير هدف init لتضمين دليل الإنشاء في Build ClassPath ، حيث ستحتاج Scala إلى ذلك لإعادة ترجمة فئات أخرى. يجب أن تبدو هذه:
<path id="build.classpath">
<pathelement location="${scala-library.jar}"/>
<pathelement location="${scala-compiler.jar}"/>
<pathelement location="${build.classes.dir}"/>
</path>
لمزيد من التفاصيل ، يرجى الرجوع إلى مدونة Caoyuan.
نصائح أخرى
تم إعادة ترجمة Tokens.scala لأنه لا يوجد ملف فئة يطابق اسمه الأساسي. وهذا هو ، لا ينتج ملف الرموز. عند تحديد ما إذا كان يجب تجميع ملف مصدر ، يبحث FSC عن ملفوف مع نفس اسم basenam . إذا استطعت ، أقترح أن تنظر إلى أداة بناء بسيطة, ، وضع الترجمة المستمر الخاص به يتتبع بدقة المصدر-> رسم خرائط للتصنيف ولن يعيد ترجمة الرموز.
للحصول على ضحكات إضافية ، فكر في ما قد يفعله المترجم إذا كان لديك ملف مصدر مختلف لديه class Tokens
فيه.
على الرغم من أن Scala تتيح الفئات/الكائنات العامة التعسفية في أي ملف مصدر ، لا يزال هناك الكثير من الأدوات التي تفترض أنك ستتبع إلى حد ما اتفاقية Java ولديها على الأقل فئة/كائن واحد في الملف بنفس اسم اسم الملف المصدر.