2012-01-21 11 views
18

मैं एक प्रोग्राम चाहता हूं जिसे मैं रनटाइम पर अपने संस्करण की रिपोर्ट करने में सक्षम होने के लिए तैयार कर रहा हूं (उदा। scala myprog.jar --version)। पारंपरिक रूप से एक मेवेन प्रोजेक्ट में, मैं संसाधन फ़िल्टरिंग (pom.xml -> file.properties -> रनटाइम पर मान पढ़ता हूं) का उपयोग करता हूं। मुझे पता है कि इस कार्यक्षमता को अनुकरण करने के लिए sbt-filter-plugin है, लेकिन अगर मैं एसबीटी में ऐसा करने का अधिक मानक/पसंदीदा/चालाक तरीका हूं तो मैं उत्सुक हूं।एसबीटी प्रोग्राम में संस्करण संख्या सहित

tl; dr रनटाइम पर build.sbt में परिभाषित संस्करण संख्या को मैं कैसे पढ़ सकता हूं?

+0

आजकल ऐसा करने का सही बेवकूफ तरीका sbt-buildinfo https://github.com/sbt/sbt-buildinfo/ के माध्यम से है। –

उत्तर

19

अद्यतन ...

https://github.com/ritschwumm/xsbt-reflect (जैसा कि ऊपर उल्लेख) अप्रचलित है, लेकिन इस शांत एसबीटी रिहाई उपकरण है जो स्वचालित रूप से संस्करणों और अधिक प्रबंधित कर सकते हैं: https://github.com/sbt/sbt-release

वैकल्पिक रूप से, अगर आप एक त्वरित सुधार आप इस तरह प्रकट से संस्करण प्राप्त कर सकते हैं:

val version: String = getClass.getPackage.getImplementationVersion 

यह मान आपके परियोजना है जो आप build.sbt या Build.scala में या तो सेट में version सेटिंग के बराबर हो जाएगा।

एक और अद्यतन ...

Buildinfo एसबीटी प्लगइन संस्करण build.sbt के आधार पर संख्या के साथ एक वर्ग उत्पन्न कर सकते हैं:

/** This object was generated by sbt-buildinfo. */ 
case object BuildInfo { 
    /** The value is "helloworld". */ 
    val name: String = "helloworld" 
    /** The value is "0.1-SNAPSHOT". */ 
    val version: String = "0.1-SNAPSHOT" 
    /** The value is "2.10.3". */ 
    val scalaVersion: String = "2.10.3" 
    /** The value is "0.13.2". */ 
    val sbtVersion: String = "0.13.2" 
    override val toString: String = "name: %s, version: %s, scalaVersion: %s, sbtVersion: %s" format (name, version, scalaVersion, sbtVersion) 
} 

इसे यहाँ कैसे सक्षम करने के लिए पर डॉक्स देखें: https://github.com/sbt/sbt-buildinfo/

+2

दुर्भाग्यवश, यह मेरे लिए 'शून्य' देता है। एसबीटी 0.13.8, जेडीके 8, स्कैला 2.11.7 – akauppi

+0

क्या आपने एसबीटी में 'संस्करण' सही ढंग से सेट किया था? –

+0

हां, यह आउटपुट जार फ़ाइल नाम और आगे में दिखाता है। लेकिन परियोजना कोई मेवेन पोम नहीं बना रही है, यह एक स्टैंडअलोन निष्पादन योग्य है। मुझे लगता है कि यही कारण है कि यह इन कार्यान्वयन/विनिर्देश संस्करणों आदि नहीं मिलेगा। किसी भी पॉइंटर्स का स्वागत है - मैं जावा पृष्ठभूमि से नहीं हूं इसलिए ये मुझे थोड़ा अधिक उदार महसूस करते हैं। :) – akauppi

7

xsbt-reflect प्लगइन का उपयोग करें। यह एक स्रोत फ़ाइल उत्पन्न करेगा जिसमें अन्य चीजों के साथ, प्रोजेक्ट संस्करण संख्या शामिल होगी।

+0

धन्यवाद, एक बहुत अच्छा समाधान की तरह दिखता है –

+0

एक आकर्षण की तरह काम किया, धन्यवाद। –

1

मैं बिल्ड सिस्टम बनाने के लिए समाप्त हुआ (मैं sbt के शीर्ष पर उपयोग करता हूं) पढ़ने के लिए स्केल के लिए src/main/resources/version.txt फ़ाइल तैयार करें।

Makefile में:

$(RESOURCES_VERSION): build.sbt 
    grep "^version := " $< | cut -f2 -d\" > [email protected] 

स्काला में:

val version: String = { 
    val src = Source.fromURL(getClass.getResource("/version.txt")) 
    src.getLines.next // just take the first line 
} 

यह मेरे लिए काम करता है।

यह उत्सुक है कि इस तरह की एक आवश्यक विशेषता (मुझे लगता है) स्कैला में आसानी से उपलब्ध नहीं है। इसके लिए सिर्फ एक बहुत ही सरल sbt प्लगइन का स्वागत होगा।

+0

यह वेनिला एसबीटी में आसानी से उपलब्ध है, मेरा जवाब देखें। – Tvaroh

0

सामान्य तौर पर, किसी भी प्लगइन के बिना ही, आप कुछ इस तरह कर सकते हैं:

sourceGenerators in Compile += Def.task { 
    val file = (sourceManaged in Compile).value/"foo"/"bar"/"BuildInfo.scala" 

    IO.write(
    file, 
    s"""package foo.bar 
     |object BuildInfo { 
     | val Version = "${version.value}" 
     |}""".stripMargin 
) 

    Seq(file) 
}.taskValue 

और फिर foo.bar.BuildInfo.Version निरंतर जो कुछ भी आप की तरह के साथ क्या।

या अधिक सामान्य:

def generateBuildInfo(packageName: String, 
         objectName: String = "BuildInfo"): Setting[_] = 
    sourceGenerators in Compile += Def.task { 
    val file = 
     packageName 
     .split('.') 
     .foldLeft((sourceManaged in Compile).value)(_/_)/s"$objectName.scala" 

    IO.write(
     file, 
     s"""package $packageName 
     |object $objectName { 
     | val Version = "${version.value}" 
     |}""".stripMargin 
    ) 

    Seq(file) 
    }.taskValue 

उदाहरण:

settings(generateBuildInfo("foo.bar")) 

तुम भी एक Map[String, String] के रूप में वस्तु गुण गुजरती हैं और वस्तु उचित रूप से उत्पन्न करने के लिए इसे बदल सकते हैं।

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