2011-09-13 12 views
5

मैं एक कार्य को परिभाषित करना चाहता हूं, जो संकलन और पैकेज को आमंत्रित करता है, और फिर इसकी सामग्री करता है। मैं उसको कैसे करू? वर्तमान में यह केवल दूसरा भाग करता है और संकलन & पैकेजबिन कार्यों पर संकुचित करता है।अन्य कार्यों पर निर्भर कैसे करें और एसबीटी 0.10 में अपना कोड करें?

lazy val dist = TaskKey[Unit](
    "dist", "Creates a project distribution in dist/ folder." 
) 
def distTask = { 
    dist <<= dist.dependsOn(compile, packageBin) 
    dist <<= (update, crossTarget).map { case (updateReport, out) => 
    updateReport.allFiles.foreach { srcPath => 
     val destPath = out/"lib"/srcPath.getName 
     IO.copyFile(srcPath, destPath, preserveLastModified=true) 
    } 
    } 
} 
+0

अभी तक एक कामकाज के रूप में मैं ~; संकलन; पैकेज; dist कार्य – arturaz

उत्तर

3

<<= टास्ककी पर एक विधि है जो एक मूल्य देता है। यह कहीं भी परिवर्तनीय स्थिति अद्यतन नहीं करता है, इसलिए उदाहरण कोड में, पहली कॉल का परिणाम त्याग दिया जा रहा है। इसे ठीक करने के लिए, पैकेज को एक इनपुट के रूप में भी घोषित करें, लेकिन परिणामी मान को अनदेखा करें। ध्यान दें कि पैकेजबिन संकलन पर निर्भर करता है, इसलिए संकलन के आधार पर अनावश्यक है।

dist <<= (update, crossTarget, packageBin in Compile) map { (updateReport, out, _) => 

यह है कि आप फ़ाइल के नाम पर आधारित एक निर्देशिका करने के लिए एक UpdateReport में फ़ाइलों के सभी प्रतिलिपि बनाना चाहते हैं संभावना नहीं है। विभिन्न निर्भरताओं के लिए एक ही फ़ाइल नाम होना संभव है। इसके अलावा, इसमें परीक्षण निर्भरताओं सहित सभी विन्यासों की निर्भरता शामिल होगी।

पहली समस्या के लिए, retrieveManaged := true पर lib_managed निर्देशिका में किए गए लक्ष्य निर्देशिका में पथ बनाने के लिए संबंधित ModuleID का उपयोग करें। दूसरी समस्या के लिए, केवल कॉन्फ़िगरेशन के लिए फ़ाइलों का चयन करें।

updateReport.matching(configurationFilter(Runtime.name)).foreach... 

अन्य उपयोगी तरीकों के लिए sbt.UpdateReport और sbt.RichUpdateReport एपीआई डॉक्स देखें।

यदि आप फ़ाइल नाम टकराव के बारे में चिंतित नहीं हैं, तो आप निर्भरता क्लासपाथ से निर्भरता फ़ाइलों को प्राप्त कर सकते हैं। उदाहरण के लिए:

dist <<= (crossTarget, packageBin in Compile, dependencyClasspath in Runtime) map { (out, _, cp) => 

और cp.files से Seq[File] मिलता है।

+0

का उपयोग करने में सक्षम था महान जवाब के लिए धन्यवाद। हालांकि जब मैं निर्भरता के रूप में पैकेजबिन जोड़ने की कोशिश करता हूं, तो मुझे यह मिलता है: [त्रुटि] sbt.Init $ Uninitialized: अनियमित सेटिंग का संदर्भ {फ़ाइल:/home/arturas/work/spacegame/server/विक्रेता/SpaceMule /} SpaceMule/*: {file:/home/arturas/work/spacegame/server/विक्रेता/SpaceMule /} SpaceMule/*: dist [त्रुटि] पूर्ण लॉग के लिए 'अंतिम' का उपयोग करें। – arturaz

+0

क्या आपने 'संकलन' भाग शामिल किया था? –

+1

ओह, मुझे इसे याद करना होगा। यह अब काम करता है, धन्यवाद :) – arturaz

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