كيف يتمكن غانت الأهداف المرجعية بأسمائها، وليس الحصول على استثناء خاصية مفقود؟

StackOverflow https://stackoverflow.com/questions/2231972

سؤال

في التعليمات البرمجية المقدمة هنا: ملف gant., ، هناك الكود التالي:

target(dist: 'Create release artefacts') {
        depends(test)
        depends(jar)
}
target(run: 'Run the distributed jar') {
        depends(dist)
        Ant.java(jar: distributedJarPath, fork: 'true')
}

target(hello: 'Hello World') {
        println("Hello World")
}

setDefaultTarget(dist)

أنا مهتم بكيفية الكتابة setDefaultTarget(dist), ولا تتلقى استثناء dist كملكية مفقودة. هل هذا المقتطف تقييمه في سياق بعض الكائن، والأهداف تخلق متغيرات مثيل؟

هل كانت مفيدة؟

المحلول

هناك نوعان من العناصر التي تحتاجها للنظر، ملزمة البرنامج النصي، وكيف يتم إعلان الهدف.

أولا هناك ملزمة. البرنامج النصي المزخرف مختلفا قليلا عن فئة Groovy / Java. البرامج النصية Groovy تسمح للمتغيرات غير المنقولة. المعنى عند ترجمة البرنامج النصي لا يتم الإعلان عن المتغير. عندما يرى التحويل البرمجي أحد المراجع المتغيرة غير المعلن هذه، فإنه سيؤدي بتحويل الضاغ إلى المتغير تحت الأغطية إلى مكالمة إلى Binding.getVariable (اسم متغير) (أو شيء ما فيه). لذلك السطر الأخير من البرنامج النصي هو متكافئ وظيفيا ل

setDefaultTarget(binding.getVariable('dist'))

ثانيا هناك هو إعلان الهدف. عندما يتم الإعلان عن الهدف، يرى مترجم Groovy في الواقع استدعاء طريقة: الهدف (خريطة Maps، إغلاق إغلاق) (أو ThereAbout). عندما تنفذ هذه الطريقة، يقوم بفحص Args، استخراج اسم الهدف، ويخزن بعض المرجع الملفوف إلى الإغلاق بهذا الاسم في الربط. سيكون التخلص من ذلك ..

target(Map args, Closure closure) {
  binding.setVarialbe( 
    args.keySet().iterator().next(),
    gantClosureWrapping(args, closure))
}

بالطبع رمز أعلاه هو تقريب وليس رمز Gant الحقيقي.

لذلك في جوهر ...

target(dist: 'doc') { ... }
// the above adds 'dist' as a variable to the binding

//...

setDefaultTarget(dist)
// dist is unbound, so it is replaced with binding.getVariable('dist')
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top