मान लीजिए कि मेरे पास स्कैला संकलन-समय मैक्रो है जो मुझे उपयोगी लगता है और इसे साझा करना चाहता हूं (मैं करता हूं)। मैं एक जेएआर फ़ाइल कैसे बना सकता हूं कि जब किसी अन्य प्रोजेक्ट में लोड किया जाता है तो नई परियोजना को संकलित करते समय मैक्रो निष्पादित करेगा?मैं एक परियोजना के रूप में एक स्कैला मैक्रो कैसे वितरित करूं?
विशेष रूप से, मैंने 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) जटिल निर्माण निर्देशों के साथ न आएं: वे केवल कहते हैं, "मैवेन सेंट्रल में इस निर्भरता को इंगित करें।" मैं अपनी निर्माण प्रक्रिया में जादू नहीं ढूंढ सका जो यह काम करता है। मैं क्या खो रहा हूँ?