2017-07-10 21 views
11

Có thể gọi ra để lấy khóa từ yargs khi sử dụng làm đối số tập lệnh npm không?npm script pass tham số/đối số cho kịch bản lệnh bằng cách sử dụng yargs

loại người dùng trong thiết bị đầu cuối OSX:

npm run scaffold --name=blah 

mà thực hiện trong package.json:

"scaffold" : "node ./scaffold/index.js -- " 

Điều này dẫn đến

const yargs = require('yargs').argv 

if (yargs) { 
    console.log(yargs); 
    console.log(yargs.name); 
    process.exit(1) 
} 
... 
result: 
{ _: [], '$0': 'scaffold/index.js' } 
undefined 

chỉ này hoạt động nếu tôi cứng mã trong package.json "scaffold" : "node scaffold/index.js --name=blah", nhưng tôi cần điều này để có thể cấu hình được.

Như tôi đã nói tôi đang sử dụng arg, vì nó xuất hiện để làm cho nó dễ dàng để lấy chìa khóa theo tên (như trái ngược với một mảng). Mở để đề xuất.

Tôi đang thiếu gì?

cập nhật 2017/11/07 liên quan: Sending command line arguments to npm script

Tuy nhiên, đi qua trong commandline 1: npm run scaffold name=hello HOẶC 2: npm run scaffold --name=hello sản lượng:

1: { _: [], '$0': 'scaffold/index.js' } 
2: { _: [ 'name=hello' ], '$0': 'scaffold/index.js' } 

Vẫn không thể nhìn thấy một cách để lấy lại tài sản yargs.name . Vẫn chưa được xác định.


Cập nhật 13-07-2017

Đối với thời gian được, tôi đã từ bỏ. Nó dường như không thể. Tôi chạy kịch bản bằng tay trong thiết bị đầu cuối. Ví dụ:

node ./scaffold/index.js --name=blah 

Hình ảnh bên dưới hiển thị trực tiếp kịch bản nút thay vì chạy qua tập lệnh npm. Tôi đã thêm https://www.npmjs.com/package/nopt mô-đun nút để xem liệu nó có giúp (không). process.argv.name vẫn chưa được xác định khi chạy qua tập lệnh npm.

enter image description here


Cập nhật 18-07-2017

Added github dụ: https://github.com/sidouglas/stackoverflow-node-arguments


Cập nhật 24-07-2017

Thêm các biến trước khi bắt đầu các lệnh làm việc myvar="hello npm run scaffold như trái ngược với npm run scaffold myvar="hello world"

Trả lời

4

Tôi không chắc chắn rằng nó quan trọng mà các biến được thêm vào dòng lệnh, và nếu điều này là không quan tâm đến bạn, sau đó làm việc này:

//package.json 
{ 
    "name": "npm-test", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "dependencies": {}, 
    "devDependencies": {}, 
    "scripts": { 
    "start": "node index.js" 
    }, 
    "author": "", 
    "license": "ISC" 
}  

tập tin JS của bạn:

//index.js 
console.log('myvar', process.env.myvar);  

Và lệnh dòng lệnh của bạn:

myvar="hello world" npm run start  

Vì vậy, cuối cùng, chỉ tiền tố lệnh kịch bản NPM của bạn với danh sách đối số của bạn.

+0

Rất thú vị. Thêm biến vào đầu của lệnh hoạt động. Cuối cùng, nó không thành công. Cảm ơn câu trả lời của bạn – Simon

+0

Rất vui vì bạn đã tìm ra câu trả lời. Chỉ cần đẩy một chi nhánh mới vào repo ví dụ của bạn với những thay đổi được bao gồm và github không hợp tác. – Chase

3

Tính đến [email protected], bạn có thể sử dụng đối số tùy chỉnh khi thực hiện các kịch bản. Các tùy chọn đặc biệt - được sử dụng bởi getopt để delimit kết thúc của các tùy chọn.NPM sẽ vượt qua tất cả các đối số sau - trực tiếp đến kịch bản của bạn:

npm run test -- --grep="pattern"

https://docs.npmjs.com/cli/run-script

+0

Câu trả lời này chưa hoàn thành. Tôi đã đến trang này, đọc và đọc lại một vài lần. Ví dụ bạn đã sao chép và dán. Trong ví dụ của tôi, nếu tôi console.log của bạn 'process.argv', I * vẫn * không thấy các phương tiện để lấy thuộc tính' name' trên process.argv, cũng như 'grep'argument của bạn, trong ví dụ trả lời của bạn. – Simon

+0

Nếu bạn có thể tạo kho lưu trữ GitHub công cộng với mã của bạn (package.json, index.js, v.v.) tôi có thể thử và gỡ lỗi nó. – sabrehagen

+0

đã thêm kho lưu trữ. (https://github.com/sidouglas/stackoverflow-node-arguments) – Simon

Các vấn đề liên quan