سؤال

تقوم 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 ولديها على الأقل فئة/كائن واحد في الملف بنفس اسم اسم الملف المصدر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top