เรียกใช้คำสั่งในงาน Grunt


94

ฉันใช้Grunt (เครื่องมือสร้างบรรทัดคำสั่งตามงานสำหรับโปรเจ็กต์ JavaScript) ในโปรเจ็กต์ของฉัน ฉันได้สร้างแท็กที่กำหนดเองแล้วและฉันสงสัยว่าจะสามารถเรียกใช้คำสั่งได้หรือไม่

เพื่อความชัดเจนฉันกำลังพยายามใช้ Closure Templates และ "the task" ควรเรียกไฟล์ jar เพื่อคอมไพล์ไฟล์ Soy ไว้ล่วงหน้าเป็นไฟล์ javascript

ฉันเรียกใช้ jar นี้จากบรรทัดคำสั่ง แต่ฉันต้องการตั้งค่าเป็นงาน

คำตอบ:


105

หรือคุณสามารถโหลดปลั๊กอินฮึดฮัดเพื่อช่วยสิ่งนี้:

ตัวอย่างของgrunt-shell :

shell: {
  make_directory: {
    command: 'mkdir test'
  }
}

หรือตัวอย่างคำสั่งผู้บริหาร :

exec: {
  remove_logs: {
    command: 'rm -f *.log'
  },
  list_files: {
    command: 'ls -l **',
    stdout: true
  },
  echo_grunt_version: {
    command: function(grunt) { return 'echo ' + grunt.version; },
    stdout: true
  }
}

9
ไม่มีใครรู้ว่าทั้งสองอย่างนี้ใช้งานได้บน Windows หรือไม่?
Capaj

ฉันไม่grunt-shellสามารถทำงานกับ Windows + Cygwin ได้ทันทีแต่ฉันโชคดีกว่ากับgrunt-exec.
นาธาน

3
มีวิธีใช้ grunt-exec พร้อมกันหรือไม่? มันจะดีที่จะเชื่อมโยงคำสั่งเข้าด้วยกัน
funseiki

1
@funseiki เพียงใส่คำสั่งภายในแบทช์หรือเชลล์ที่เรียกคำสั่งตามลำดับที่คุณต้องการ หรือคุณกำหนดงานเช่น mycmds และเขียน"exec:cmd1", "exec:cmd2"จากนั้นคุณก็มีคำสั่งพร้อมกัน
Sebastian

35

ตรวจสอบgrunt.util.spawn:

grunt.util.spawn({
  cmd: 'rm',
  args: ['-rf', '/tmp'],
}, function done() {
  grunt.log.ok('/tmp deleted');
});

5
ด้วยopts: {stdio: 'inherit'},คุณสามารถดูผลลัพธ์ของคำสั่ง
JuanPablo

2
หมายเหตุ: พารามิเตอร์ cmd ควรเป็นสตริงไม่ใช่อาร์เรย์
RKI

1
ตอนนี้ต้องใช้grunt-legacy-utilปลั๊กอิน ขอแนะนำให้ใช้require('child_process').spawn()แทน
JD

20

ฉันพบวิธีแก้ปัญหาแล้วฉันจึงอยากแบ่งปันกับคุณ

ฉันใช้คำสั่ง grunt ภายใต้โหนดดังนั้นในการเรียกคำสั่งเทอร์มินัลคุณต้องใช้โมดูล 'child_process'

ตัวอย่างเช่น,

var myTerminal = require("child_process").exec,
    commandToBeExecuted = "sh myCommand.sh";

myTerminal(commandToBeExecuted, function(error, stdout, stderr) {
    if (!error) {
         //do something
    }
});

12
แนวทางที่ดีกว่าคือการใช้ปลั๊กอิน (หรือเขียนของคุณเอง) เพื่อให้การกำหนดค่าฮึดฮัดของคุณเป็น config ไม่ใช่โค้ด grunt-shell & grunt-exec เป็นสองตัวอย่าง
papercowboy

อย่างที่คุณใช้shมาก่อนsh mayCommand.sh ฉันไม่แน่ใจว่ามันจะใช้ได้กับ windows
svassr

มันใช้ไม่ได้เพราะเป็นการเขียนสคริปต์ทุบตี ฉันทำงานภายใต้ Unix OS
JuanO

18

หากคุณกำลังใช้เวอร์ชันฮึดฮัดล่าสุด (0.4.0rc7 ในขณะที่เขียนนี้) ทั้ง grunt-exec และ grunt-shell ล้มเหลว (ดูเหมือนจะไม่ได้รับการอัปเดตเพื่อจัดการกับคำรามล่าสุด) ในทางกลับกัน exec ของ child_process คือ async ซึ่งเป็นเรื่องยุ่งยาก

ฉันลงเอยด้วยการใช้โซลูชันของ Jake Trentและเพิ่มshelljsเป็นการพึ่งพา dev ในโครงการของฉันดังนั้นฉันจึงสามารถเรียกใช้การทดสอบได้อย่างง่ายดายและพร้อมกัน:

var shell = require('shelljs');

...

grunt.registerTask('jquery', "download jquery bundle", function() {
  shell.exec('wget http://jqueryui.com/download/jquery-ui-1.7.3.custom.zip');
});

1
fyi grunt-shellทำงานได้ดีgrunt v0.4.5ภายใต้ Windows
fiat

ฉันคิดว่าการใช้ shelljs เป็นวิธีแก้ปัญหาที่ยอดเยี่ยมเพราะช่วยให้แอปโหนดของคุณสามารถเข้าถึงเชลล์ได้และช่วยให้คุณสามารถควบคุมมันได้ดีกว่าส่วนเสริมฮึดฮัดเพียงอย่างเดียว
Nick Steele

14

พวกกำลังชี้ child_process แต่ลองใช้execSyncเพื่อดูผลลัพธ์ ..

grunt.registerTask('test', '', function () {
        var exec = require('child_process').execSync;
        var result = exec("phpunit -c phpunit.xml", { encoding: 'utf8' });
        grunt.log.writeln(result);
});

ทางออกที่ยอดเยี่ยมโดยไม่ต้องใช้ปลั๊กอินเพิ่มเติม
valentinvieriu

ฉันพยายามเรียกใช้งานมาหนึ่งวันและในที่สุดก็เป็นวิธีง่ายๆที่ได้ผล!
5

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.