ดำเนินการคำสั่งในอึกสำหรับโฟลเดอร์ย่อย

โครงการของฉันมีโครงสร้างดังนี้:

myapp
 -server.js
 -test
 --testcontent
 ---package.json
 -package.json

ฉันมี package.json ไฟล์สองไฟล์ และฉันต้องการเรียกใช้ npm install บน package.json ภายในโฟลเดอร์ testcontent

หากในบรรทัดคำสั่งฉันไปที่ myapp/test/testcontent และเรียกใช้ npm install มันใช้งานได้และสร้างโฟลเดอร์ใหม่ node_modules โดยมีการขึ้นต่อกันจาก package.json ที่ถูกต้อง จะทำแบบนั้นจากภายในอึกได้อย่างไร?

ฉันลองทำสิ่งต่อไปนี้แล้ว แต่ใช้ package.json ใน myapp ไม่ใช่อันที่อยู่ในโฟลเดอร์ย่อย testcontent:

gulp.task('default', function () {
    var options = {
        continueOnError: true, // default = false, true means don't emit error event
        pipeStdout: true, // default = false, true means stdout is written to file.contents
        customTemplatingThing: "test" // content passed to gutil.template()
    };
    var reportOptions = {
        err: true, // default = true, false means don't write err
        stderr: true, // default = true, false means don't write stderr
        stdout: true // default = true, false means don't write stdout
    }
    gulp.src('test/testcontent/')
        .pipe(exec('npm install' , options))
        .pipe(exec.reporter(reportOptions));
});

person Community    schedule 24.07.2016    source แหล่งที่มา


คำตอบ (1)


gulp-execเป็นเครื่องมือที่ไม่ถูกต้องสำหรับงานนี้ อันที่จริง ผู้เขียนปลั๊กอิน gulp-exec แนะนำอย่างชัดเจนไม่ให้ใช้ในลักษณะที่คุณทำ:

หมายเหตุ: หากคุณต้องการเรียกใช้คำสั่ง เพียงเรียกใช้คำสั่ง อย่าใช้ปลั๊กอินนี้

แต่คุณใช้ child_process.spawn() ในตัวแทน คุณสามารถส่งไดเร็กทอรีที่ควรดำเนินการคำสั่งโดยใช้ตัวเลือก cwd:

var spawn = require('child_process').spawn;

gulp.task('default', function(done) {
  spawn('npm', ['install'], { cwd: 'test/testcontent/', stdio: 'inherit' })
    .on('close', done);
});
person Sven Schoenung    schedule 24.07.2016
comment
ขอบคุณ แล้วฉันจะไพพ์มันไปยังกระบวนการอื่นได้อย่างไร สมมติว่าฉันต้องการไพพ์แบบนี้ return gulp .src(config.alljs) .pipe($.if(args.verbose, $.print())) - person ; 24.07.2016
comment
คุณหมายถึงอะไรไปป์มันไปยังกระบวนการอื่น? คุณต้องการส่ง stdout ของการติดตั้ง npm ไปยังกระบวนการอื่นหรือไม่? คุณต้องการทำอะไรกันแน่? - person Sven Schoenung; 24.07.2016
comment
ตัวอย่างของคุณไม่สมเหตุสมผล การพิมพ์ชื่อไฟล์เกี่ยวข้องกับการดำเนินการติดตั้ง npm อย่างไร ทั้งสองไม่เกี่ยวข้องกันเลย - person Sven Schoenung; 24.07.2016
comment
เช่น หากคุณต้องการติดตั้ง npm และต้องการคัดลอกไฟล์ ฯลฯ คุณจะทำอย่างไร? - person ; 24.07.2016
comment
คุณเขียนงานหนึ่งงานเพื่อคัดลอกไฟล์และงานหนึ่งงานเพื่อดำเนินการติดตั้ง npm จากนั้นคุณดำเนินการทั้งสองงานเหล่านั้น เนื่องจากการดำเนินการทั้งสองไม่มีอะไรที่เหมือนกันเลย จึงควรแยกงานกัน - person Sven Schoenung; 24.07.2016
comment
แต่ถ้าเช่น ฉันต้องการให้มันทำงานโดย ‹b›default‹/b› spawn & copy & run mochaTest คุณจะทำอย่างไร? คุณช่วยยกตัวอย่างได้ไหม? - person ; 24.07.2016
comment
ไม่ ไม่ใช่ในโพสต์นี้ ฉันตอบคำถามเดิมของคุณ คุณกำลังถามคำถามที่แตกต่างไปจากเดิมอย่างสิ้นเชิงตอนนี้ ตั้งกระทู้ใหม่เพื่อสิ่งนั้นครับ - person Sven Schoenung; 24.07.2016