2015-07-06 3 views
8

मान लीजिए कि मेरे पास स्कैला संकलन-समय मैक्रो है जो मुझे उपयोगी लगता है और इसे साझा करना चाहता हूं (मैं करता हूं)। मैं एक जेएआर फ़ाइल कैसे बना सकता हूं कि जब किसी अन्य प्रोजेक्ट में लोड किया जाता है तो नई परियोजना को संकलित करते समय मैक्रो निष्पादित करेगा?मैं एक परियोजना के रूप में एक स्कैला मैक्रो कैसे वितरित करूं?

विशेष रूप से, मैंने StaticAnnotation बनाया है जो कक्षा के एएसटी को फिर से लिखता है जो संकलन समय से पहले लपेटता है। यह मेरा Maven निर्माण में काम करता है (मैक्रो main निर्देशिका में परिभाषित, test निर्देशिका में परीक्षण मामलों पर चलता है) क्योंकि मैं

<compilerPlugins> 
    <compilerPlugin> 
     <groupId>org.scalamacros</groupId> 
     <artifactId>paradise_2.10.5</artifactId> 
     <version>2.1.0-M5</version> 
    </compilerPlugin> 
</compilerPlugins> 
मेरी scala-maven-plugin में

है। (मैं एक स्काला 2.10 प्रोजेक्ट से शुरू कर रहा हूं और यदि यह 2.10 और 2.11 दोनों प्रदान करेगा।)

लेकिन यदि मैं परिणामी जेएआर को स्कैला कंसोल क्लासपाथ पर, स्कैला स्क्रिप्ट में या किसी अन्य मेवेन प्रोजेक्ट में डालता हूं (विशेष कंपाइलर प्लगइन्स के बिना), यह बस मैक्रो को अनदेखा करता है: एएसटी ओवरराइट नहीं होता है और मेरा संकलन-समय println कथन निष्पादित नहीं होता है। अगर मैं अपने मैक्रो (स्कैला 2.11 में नया) पर @compileTimeOnly एनोटेशन का उपयोग करता हूं, तो यह @compileTimeOnly त्रुटि संदेश से शिकायत करता है।

क्या मुझे वास्तव में अपने उपयोगकर्ताओं को अपने pom.xml फ़ाइलों में कंपाइलर प्लगइन्स जोड़ने के साथ-साथ एसबीटी और अन्य निर्माण उपकरणों के लिए वैकल्पिक निर्देश जोड़ने की आवश्यकता है? मैक्रोज़ युक्त अन्य पैकेज (MacWire, Log4s) जटिल निर्माण निर्देशों के साथ न आएं: वे केवल कहते हैं, "मैवेन सेंट्रल में इस निर्भरता को इंगित करें।" मैं अपनी निर्माण प्रक्रिया में जादू नहीं ढूंढ सका जो यह काम करता है। मैं क्या खो रहा हूँ?

उत्तर

4

यदि आप मैक्रो-स्वर्ग-केवल सुविधा पर भरोसा कर रहे हैं तो हाँ, आपको अपने उपयोगकर्ताओं को कंपाइलर प्लगइन्स जोड़ने के लिए बताने की आवश्यकता है। http://docs.scala-lang.org/overviews/macros/annotations.html देखें। जिन परियोजनाओं का आप उल्लेख करते हैं वे केवल स्काला कंपाइलर के अंतर्निर्मित (गैर-स्वर्ग) मैक्रो सुविधाओं का उपयोग कर रहे हैं, मैक्रो एनोटेशन नहीं।

संबंधित मुद्दे