2011-12-18 51 views
18

मैं प्ले फ्रेमवर्क के साथ एसबीटी का उपयोग कर रहा हूं।एसबीटी में परीक्षण कार्य से पहले निष्पादित करने के लिए कस्टम कार्य कैसे संलग्न करें?

import sbt._ 
import sbt.Process._ 
import PlayProject._ 

object ApplicationBuild extends Build { 

    val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.") := {} 

    val main = PlayProject("xxx", 1.0, Seq()) 
    .settings(defaultScalaSettings: _*) 
    .settings(testJsTask) 
} 

अब तक तो अच्छा:

मैं अपने प्रोजेक्ट में जावास्क्रिप्ट परीक्षण चलाने के लिए कस्टम TaskKey बनाया।

मैं कार्य निष्पादित करते समय हमेशा यह testJsTask चलाने के लिए चाहता हूं।

मुझे लगता है कि इस प्रकार यह कुछ होना चाहिए:

test in Test <<= (test in Test).dependsOn(testJsTask) 

मैं पता नहीं वास्तव में यह कैसे परिभाषित किया जाना चाहिए है। 'परीक्षण' या 'बिल्ड' जैसे किसी मौजूदा कार्य पर निर्भरता कैसे जोड़ें?

अद्यतन

@Christian द्वारा प्रस्तावित बदलावों के बाद निर्माण परिभाषा इस प्रकार है:

object ApplicationBuild extends Build { 
    val testJsTask = TaskKey[Unit]("testJs", "Run tests for javascript client.") 
    def testJs = {} 

    val main = PlayProject("xxx", 1.0, Seq()) 
    .settings(defaultScalaSettings: _*) 
    .settings(testJsTask := testJs) 

    (test in Test) <<= (test in Test) dependsOn (testJs) 
} 

दुर्भाग्य से, समाधान या तो काम नहीं करता:

[error] /xxx/project/Build.scala:21: not found: value test 
[error] (test in Test) <<= (test in Test) dependsOn (testJs) 
[error] ^
[error] one error found 
[error] {file:/xxx/project/}default-f468ae/compile:compile: Compilation failed 
+0

क्या आप सफल रहे हैं? क्या मेरा नवीनतम संपादन आपकी मदद करता है? – Christian

+0

दुर्भाग्यपूर्ण मुझे प्ले संस्करण के साथ ऐसा करने का तरीका नहीं दिख रहा है:/मैं कुछ और परीक्षण करने की कोशिश करूंगा और यदि कोई सफलता होगी तो मैं यहां रिपोर्ट करूंगा। –

+0

मुझे यह देखने में दिलचस्पी है कि आपको कोई रिज़ॉल्यूशन मिला है या नहीं। भविष्य में पाठकों के लिए – 2rs2ts

उत्तर

14

यह वह जगह है ऐसा करने का एक तरीका:

val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.")  

अपनी परियोजनाओं सेटिंग में कार्य निर्धारित करें:: उस पर

testJsTask <<= testJs 

मेक परीक्षण निर्भर:

(test in Test) <<= (test in Test) dependsOn (testJs) 

testJs इस प्रकार के रूप में परिभाषित किया जा सकता है:

+६५१०४०३२१० कार्य कुंजी को परिभाषित करें
def testJs = (streams) map { (s) => { 
    s.log.info("Executing task testJs") 
    // Your implementation 
    } 

[संपादित करें ] आपको परियोजना सेटिंग्स के भीतर कार्य निर्भरताओं को परिभाषित करना होगा। एक "सामान्य" परियोजना के लिए, आप इसे निम्नलिखित तरीके से करना होगा:

lazy val testProject = Project(
    "testProject", 
    file("testProject"), 
    settings = defaultSettings ++ Seq(
     testJsTask <<= testJs, 
     (test in Test) <<= (test in Test) dependsOn (testJsTask) 
    ) 
) 
+1

किसी भी तरह यह मेरे लिए अपूर्ण पर गलत लगता है। मैं क्या करना चाहता हूं यह सुनिश्चित करता है कि जब कोई 'टेस्ट' कमांड चलाएगा, तो अन्य सभी परीक्षणों को छोड़कर यह testJs भी निष्पादित करेगा। साथ ही मैंने देखा कि आपने ': =' प्रतीक का उपयोग नहीं किया है, जो मुझे पता है कि कार्य बनाने के दौरान मुझे जरूरी है - या क्या मैं गलत हूं? संपादित करें: मैं आपका संपादन देखता हूं, अब यह और अधिक समझने लगता है, मैं इसे अभी आज़माउंगा;) –

+1

आप सीधे कार्य को परिभाषित कर सकते हैं: =। मैं दूसरी संभावना पसंद करता हूं, क्योंकि तब मैं कार्य कार्यों को वास्तविक कार्यों से अलग कर सकता हूं। – Christian

+0

मुझे अभी भी पहले की तरह ही समस्या है: Build.scala: 19: नहीं मिला: मान परीक्षण। [त्रुटि] (टेस्ट में परीक्षण) << = (टेस्ट में परीक्षण) निर्भर करता है (testJsTask) –

10

प्ले 2.2.x एसबीटी 0.13 (What’s new in Play 2.2 देखें) का उपयोग करता है। इससे build.sbt में कार्यों को लिखने के कुछ नए साधन सामने आते हैं (project/ उपनिर्देशिका में स्कैला फ़ाइल का उपयोग किए बिना)।

क्या आप उसे प्ले 2.2.x उपयोग करने के लिए आप इस प्रकार build.sbt में कार्यों के बीच निर्भरता निर्धारित कर सकते हैं तो:

lazy val testJsTask = taskKey[Unit]("Run JavaScript tests.") 

testJsTask := { 
    println("Running JavaScript tests...") 
    java.util.concurrent.TimeUnit.SECONDS.sleep(3) 
    println("...done.") 
} 

test in Test := { 
    testJsTask.value 
    (test in Test).value 
} 

अधिक जानकारी के लिए एसबीटी की आधिकारिक दस्तावेज में Tasks देखें।

+1

क्या यह चलता है अनुक्रमिक रूप से या समवर्ती रूप से कार्य? अनुक्रमिक रूप से – monkjack

+0

। पहला testJsTask, फिर परीक्षण कार्य करें। – htomek

+1

जहाँ तक मैं समझता हूं कि यह सही नहीं है @ htomek http://www.scala-sbt.org/release/docs/Custom-Settings.html#Execution+semantics+of+tasks 'Def.sequential() ' क्रम में कार्यों को चलाने के लिए http://www.scala-sbt.org/release/docs/Howto-Sequencing.html – trudolf

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

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