Gửi đối số dòng lệnh đến tập lệnh npm


819

Các scriptsphần của tôi package.jsonhiện nay trông như thế này:

"scripts": {
    "start": "node ./script.js server"
}

... có nghĩa là tôi có thể chạy npm startđể khởi động máy chủ. Càng xa càng tốt.

Tuy nhiên, tôi muốn có thể chạy một cái gì đó giống như npm start 8080và có (các) đối số được truyền cho script.js(vd npm start 8080=> node ./script.js server 8080). Điều này có thể không?

Câu trả lời:


1132

Chỉnh sửa 2014.10.30: Có thể chuyển đối npm runsố thành npm 2.0.0

Cú pháp như sau:

npm run <command> [-- <args>]

Lưu ý cần thiết --. Cần phải phân tách các thông số được truyền cho npmchính lệnh và thông số được truyền cho tập lệnh của bạn.

Vì vậy, nếu bạn có package.json

"scripts": {
    "grunt": "grunt",
    "server": "node server.js"
}

Thì các lệnh sau sẽ tương đương:

grunt task:target => npm run grunt -- task:target

node server.js --port=1337 => npm run server -- --port=1337

Để có được giá trị tham số, xem câu hỏi này . Để đọc các tham số được đặt tên, có lẽ tốt nhất là sử dụng thư viện phân tích cú pháp như yargs hoặc minimist ; nodejs hiển thị process.argvtrên toàn cầu, chứa các giá trị tham số dòng lệnh, nhưng đây là API cấp thấp (mảng chuỗi được phân tách bằng khoảng trắng, do hệ điều hành cung cấp cho tệp thực thi nút).


Chỉnh sửa 2013.10.03: Hiện tại không thể trực tiếp. Nhưng có một vấn đề GitHubnpm liên quan được mở ra để thực hiện hành vi mà bạn yêu cầu. Có vẻ như sự đồng thuận là để thực hiện điều này, nhưng nó phụ thuộc vào một vấn đề khác đang được giải quyết trước đó.


Câu trả lời gốc: Là một cách giải quyết khác (mặc dù không tiện dụng lắm), bạn có thể làm như sau:

Nói tên gói của bạn package.jsonmyPackagevà bạn cũng có

"scripts": {
    "start": "node ./script.js server"
}

Sau đó thêm vào package.json:

"config": {
    "myPort": "8080"
}

Và trong script.js:

// defaulting to 8080 in case if script invoked not via "npm run-script" but directly
var port = process.env.npm_package_config_myPort || 8080

Theo cách đó, theo mặc định npm startsẽ sử dụng 8080. Tuy nhiên, bạn có thể định cấu hình nó (giá trị sẽ được lưu trữ npmtrong bộ nhớ trong của nó):

npm config set myPackage:myPort 9090

Sau đó, khi gọi npm start, 9090 sẽ được sử dụng (mặc định từ package.jsonbị ghi đè).


1
Điều này cũng hoạt động hoàn hảo cùng với các gói như yargs; tất cả các tham số sau --có thể được phân tích cú pháp hoàn hảo trong tập lệnh của bạn.
Thomas

11
AFAIKS, điều này chỉ giúp bạn có thể thêm tham số vào cuối tập lệnh của mình .. nếu bạn cần tham số ở giữa thì sao?
Spock

109
-- --argstào lao thánh đó là lạ, nhưng sao
Tháng Tám

9
@Spock Bạn có thể sử dụng các hàm shell. Đây là một thiết lập eslint + tslint mà tôi sử dụng để cho phép chuyển các đối số tùy chỉnh sang eslint, để bảo đảm, thông qua "npm run lint - -f unix": "lint": "f () {eslint -f codeframe $ @. && npm chạy tslint && echo 'lint sạch!';}; f "
ecmanaut

3
Cách đẹp hơn để đặt giá trị "myPackage: myPort 9090" là gắn cờ cấu hình thành lệnh "--myPackage: myPort = 9090" - keithcirkel.co.uk/how-to-use-npm-as-a-build -tool
chrismarx

223

Bạn yêu cầu có thể chạy một cái gì đó như npm start 8080 . Điều này là có thể mà không cần phải sửa đổi script.jshoặc cấu hình các tập tin như sau.

Ví dụ: trong "scripts"giá trị JSON của bạn , bao gồm--

"start": "node ./script.js server $PORT"

Và sau đó từ dòng lệnh:

$ PORT=8080 npm start

Tôi đã xác nhận rằng điều này hoạt động bằng cách sử dụng bash và npm 1.4.23. Lưu ý rằng giải quyết vấn đề này không yêu cầu giải quyết vấn đề GitHub npm # 3494 .


19
Điều này hoạt động thực sự tốt. Bạn cũng có thể làm một cái gì đó như node ./script.js server ${PORT:-8080}làm cho nó tùy chọn.
graup

7
Tôi dường như không thể làm điều này trong windows với git bash. Bất cứ ai có nó làm việc có thể? (lệnh tương tự hoạt động trên Ubuntu)
Karolis arapnickis

3
Hey @graup cái này hiệu quả với tôi NODE_PORT=${PORT=8080}(không phải bằng) nhưng không phải là: - cú pháp
MaieonBrix

14
Điều này không hoạt động đa nền tảng! Ví dụ, trên Windows, lệnh sẽ cần phải có node ./script.js server %PORT%. Xem xét sử dụng cross-varcross-env .
Stijn de Witt

Usecase cho việc sử dụng env vars như cli args có vẻ khá hạn chế đối với tôi? Cũng có thể sử dụng một cái gì đó như mô-đun cấu hình để xử lý các env vars, mặc định và cấu hình nói chung.
Mr5o1

93

Bạn cũng có thể làm điều đó:

Trong package.json:

"scripts": {
    "cool": "./cool.js"
}

Trong cool.js:

 console.log({ myVar: process.env.npm_config_myVar });

Trong CLI:

npm --myVar=something run-script cool

Nên đầu ra:

{ myVar: 'something' }

Cập nhật: Sử dụng npm 3.10.3, có vẻ như nó viết thường các process.env.npm_config_biến? Tôi cũng đang sử dụng better-npm-run, vì vậy tôi không chắc đây có phải là hành vi mặc định của vanilla hay không, nhưng câu trả lời này đang hoạt động. Thay vì process.env.npm_config_myVar, hãy thửprocess.env.npm_config_myvar


4
Cảm ơn điều này đã làm việc cho tôi! Những gì tôi đã thiếu cụ thể là tiền tố "npm_config_" cho tên biến mà bạn chỉ định tại dòng lệnh.
jp093121

2
Cái này sai. process.env.npm_config_myVarTrả về đúng, không phải giá trị.
Karl Morrison

1
Hoạt động với npm phiên bản 6.8.0 nhưng chỉ khi tôi sử dụng chữ thường cho tên biến. có vẻ như lilke npm đổi nó thành chữ thường
Ofir Meguri

Giải pháp tuyệt vời, hoạt động với thông số chữ thường vào npm 6.5.0
GavinBelson

78

Câu trả lời của jakub.g là chính xác, tuy nhiên một ví dụ sử dụng grunt có vẻ hơi phức tạp.

Vì vậy, câu trả lời đơn giản hơn của tôi:

- Gửi một đối số dòng lệnh đến một kịch bản npm

Cú pháp để gửi đối số dòng lệnh đến tập lệnh npm:

npm run [command] [-- <args>]

Hãy tưởng tượng chúng ta có một nhiệm vụ bắt đầu npm trong gói.json để khởi động máy chủ phát triển webpack:

"scripts": {
  "start": "webpack-dev-server --port 5000"
},

Chúng tôi chạy nó từ dòng lệnh với npm start

Bây giờ nếu chúng ta muốn chuyển một cổng sang tập lệnh npm:

"scripts": {
  "start": "webpack-dev-server --port process.env.port || 8080"
},

chạy cái này và vượt qua cổng, ví dụ 5000 qua dòng lệnh sẽ như sau:

npm start --port:5000

- Sử dụng gói.j.j config:

Như được đề cập bởi jakub.g , bạn có thể đặt các thông số khác trong cấu hình của gói.json

"config": {
  "myPort": "5000"
}

"scripts": {
  "start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080"
},

npm start sẽ sử dụng cổng được chỉ định trong cấu hình của bạn hoặc cách khác bạn có thể ghi đè lên cổng

npm config set myPackage:myPort 3000

- Đặt tham số trong tập lệnh npm của bạn

Một ví dụ về việc đọc một biến được đặt trong tập lệnh npm của bạn. Trong ví dụ nàyNODE_ENV

"scripts": {
  "start:prod": "NODE_ENV=prod node server.js",
  "start:dev": "NODE_ENV=dev node server.js"
},

đọc NODE_ENV trong server.js hoặc sản hoặc dev

var env = process.env.NODE_ENV || 'prod'

if(env === 'dev'){
    var app = require("./serverDev.js");
} else {
    var app = require("./serverProd.js");
}

5
lưu ý rằng cú pháp như "start:prod": "NODE_ENV=prod node server.js"trong package.jsonsẽ không hoạt động trên Windows, trừ khi bạn sử dụng cross-env
jakub.g

2
Sửa chữa?: "start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },Nên "start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },theo cách sử dụng của tôi được giải thích bởi hướng dẫn này . Rõ ràng quá trình ref có thể được sử dụng trong javascript.
Aaron lăn

35

npm 2.x hỗ trợ cli args

Chỉ huy

npm run-script start -- --foo=3

Gói.json

"start": "node ./index.js"

Index.js

console.log('process.argv', process.argv);


1
Câu trả lời được chấp nhận (đưa ra sớm hơn một năm so với câu trả lời này) đã đề cập đến kỹ thuật này.
Dan Dascalescu

34

Sử dụng process.argvtrong mã của bạn sau đó chỉ cần cung cấp một dấu vết $*cho mục nhập giá trị tập lệnh của bạn.

Như một ví dụ, hãy thử nó với một tập lệnh đơn giản chỉ ghi nhật ký các đối số được cung cấp để chuẩn hóa echoargs.js:

console.log('arguments: ' + process.argv.slice(2));

gói.json:

"scripts": {
    "start": "node echoargs.js $*"
}

Ví dụ:

> npm start 1 2 3
arguments: 1,2,3

process.argv[0]là tập tin thực thi (nút), process.argv[1]là tập lệnh của bạn.

Đã thử nghiệm với npm v5.3.0 và nút v8.4.0


Không hoạt động sau khi thêm --vào các đối số, ví dụ - npm run demo.js --skip, nó hoạt động nếu được thêm vào --, ví dụ -npm run demo.js -- --skip
Shreyas

Bạn có thể sử dụng phương pháp này mà không có một echoargs.jstập lệnh riêng biệt ?
Joshua Pinter

@JoshuaPinter echoargs.js chỉ là ví dụ, tôi sẽ chỉnh sửa câu trả lời của mình để làm rõ điều này
Peter

@Peter Đúng, nhưng nó phải là một tập tin kịch bản. Tôi đang cố gắng tạo một tập lệnh sử dụng adbđể đẩy một .dbtập tin vào trình giả lập Android và chấp nhận một tham số cho đường dẫn cục bộ của .dbtập tin để đẩy nó, đây là tham số đầu tiên adb push. Một cái gì đó như thế này: "db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"và tôi muốn gọi nó với npm run db:push /Users/joshuapinter/Downloads/updated.db. Có suy nghĩ gì không?
Joshua Pinter

21

Nếu bạn muốn chuyển các đối số vào giữa tập lệnh npm, trái ngược với việc chỉ thêm chúng vào cuối, thì các biến môi trường nội tuyến dường như hoạt động tốt:

"scripts": {
  "dev": "BABEL_ARGS=-w npm run build && cd lib/server && nodemon index.js",
  "start": "npm run build && node lib/server/index.js",
  "build": "mkdir -p lib && babel $BABEL_ARGS -s inline --stage 0 src -d lib",
},

Ở đây, npm run devchuyển -wcờ đồng hồ cho babel, nhưng npm run startchỉ chạy một bản dựng thông thường một lần.


Làm thế nào điều này được gọi từ CLI?
bwobst

@dresdin npm run dev,npm start
TJ

2
Cần sử dụng cross-env để sử dụng nó trên Windows.
fracz

8

Tôi đã sử dụng một lớp lót này trong quá khứ và sau một thời gian rời khỏi Node.js đã phải thử và khám phá lại nó gần đây. Tương tự như giải pháp được đề cập bởi @francoisrv, nó sử dụng các node_config_*biến.

Tạo package.jsontập tin tối thiểu sau :

{
  "name": "argument",
  "version": "1.0.0",
  "scripts": {
    "argument": "echo \"The value of --foo is '${npm_config_foo}'\""
  }
}

Chạy lệnh sau:

npm run argument --foo=bar

Quan sát đầu ra sau:

Giá trị của --foo là 'thanh'

Tất cả những điều này được ghi lại trong tài liệu chính thức của npm:

Lưu ý: Tiêu đề Biến môi trường giải thích rằng các biến trong tập lệnh thực hiện hành vi khác với nội dung được xác định trong tài liệu. Điều này đúng khi nói về độ nhạy trường hợp , cũng như cho dù đối số được xác định bằng dấu cách hoặc dấu bằng .

Lưu ý: Nếu bạn đang sử dụng một đối số với dấu gạch nối, chúng sẽ được thay thế bằng dấu gạch dưới trong biến môi trường tương ứng. Ví dụ, npm run example --foo-bar=bazsẽ tương ứng với ${npm_config_foo_bar}.

Lưu ý: Đối với người dùng Windows không phải WSL, hãy xem nhận xét của @Doctor Blue bên dưới ... TL; DR thay thế ${npm_config_foo}bằng %npm_config_foo%.


Xin chào. Tôi đang cố gắng sử dụng ví dụ của bạn nhưng tôi sợ nó không hiệu quả với tôi. Tôi đã sao chép tập lệnh "đối số" của bạn và thực hiện tương tự cho lệnh chạy ( npm run argument --foo=bar), nhưng biến không được thay thế : "The value of --foo is '${npm_config_foo}'". Chạy trên Windows 10 nếu có vấn đề, với phiên bản 6,9.0 của NPM.
Bác sĩ Blue

@DoctorBlue Ahh phải, Node và Windows không phải lúc nào chơi đẹp ... Bài viết này có thể làm sáng tỏ về các biến môi trường trong các kịch bản NPM: (TL; DR lệnh đi thẳng vào hệ điều hành máy chủ, ngay cả khi phóng từ vỏ khác) trên blog .risingstack.com / node-js-windows-10-guide / 'Tôi không chắc về thiết lập của bạn, nhưng nếu bạn đang sử dụng Git Bash để chạy Node, bạn có thể muốn xem xét việc chạy nó thông qua các tài liệu
Andrew Odri

1
Tôi đã hiểu rồi. Chỉ cần sử dụng %npm_config_foo%thay thế. Dòng lệnh Windows thuần túy / powershell tại đây. (Đừng có lựa chọn nào khác.)
Doctor Blue

6

Điều này không thực sự trả lời câu hỏi của bạn nhưng bạn luôn có thể sử dụng các biến môi trường thay thế:

"scripts": {
    "start": "PORT=3000 node server.js"
}

Sau đó, trong tệp server.js của bạn:

var port = process.env.PORT || 3000;

1
Điều này tốt miễn là bạn đang ở trên nền tảng Unix. Thật không may, nó không hoạt động với Windows vì nó có một quy ước riêng.
Juho Vepsäläinen

6

Hầu hết các câu trả lời ở trên chỉ bao gồm việc chuyển các đối số vào tập lệnh NodeJS của bạn, được gọi bởi npm. Giải pháp của tôi là sử dụng chung.

Chỉ cần bọc tập lệnh npm bằng lệnh shgọi trình thông dịch shell (ví dụ ) và truyền các đối số như bình thường. Ngoại lệ duy nhất là số đối số đầu tiên là0 .

Ví dụ: bạn muốn thêm tập lệnh npm someprogram --env=<argument_1>, trong đó someprogramchỉ in giá trị của envđối số:

pack.json

"scripts": {
  "command": "sh -c 'someprogram --env=$0'"
}

Khi bạn chạy nó:

% npm run -s command my-environment
my-environment

Cảm ơn! Điều này thật hoàn hảo!
Felipe Desiderati

Đơn giản và thanh lịch! sẽ không hoạt động trên trình bao MS DOS.
n370

3

Từ những gì tôi thấy, mọi người sử dụng các tập lệnh pack.json khi họ muốn chạy tập lệnh theo cách đơn giản hơn. Ví dụ: để sử dụng nodemoncài đặt trong node_modules cục bộ, chúng ta không thể gọi nodemontrực tiếp từ cli, nhưng chúng ta có thể gọi nó bằng cách sử dụng ./node_modules/nodemon/nodemon.js. Vì vậy, để đơn giản hóa việc gõ dài này, chúng ta có thể đặt ...

    ...

    tập lệnh: {
      'bắt đầu': 'gật đầu app.js'
    }

    ...

... sau đó gọi npm startđể sử dụng 'gật đầu' có app.js làm đối số đầu tiên.

Những gì tôi đang cố gắng nói, nếu bạn chỉ muốn khởi động máy chủ của mình bằng nodelệnh, tôi không nghĩ bạn cần sử dụng scripts. Gõ npm starthoặc node app.jscó cùng nỗ lực.

Nhưng nếu bạn muốn sử dụng nodemonvà muốn truyền một đối số động, thì đừng sử dụng script. Thay vào đó hãy thử sử dụng symlink.

Ví dụ: sử dụng di chuyển với sequelize. Tôi tạo một liên kết tượng trưng ...

ln -s node_modules/sequelize/bin/sequelize sequelize

... Và tôi có thể vượt qua mọi tranh cãi khi tôi gọi nó ...

./sequlize -h /* show help */

./sequelize -m /* upgrade migration */

./sequelize -m -u /* downgrade migration */

Vân vân...

Tại thời điểm này, sử dụng symlink là cách tốt nhất tôi có thể tìm ra, nhưng tôi không thực sự nghĩ rằng đó là cách tốt nhất.

Tôi cũng hy vọng ý kiến ​​của bạn cho câu trả lời của tôi.


1
Điều này không trả lời câu hỏi nào cả. Tôi không biết làm thế nào nó có được 6 lượt upvote, nhưng xin chúc mừng :)
Dan Dascalescu

2

Lưu ý: Cách tiếp cận này sửa đổi nhanh chóng của bạn package.json, sử dụng nó nếu bạn không có cách nào khác.

Tôi đã phải chuyển các đối số dòng lệnh cho các tập lệnh của mình giống như:

"scripts": {
    "start": "npm run build && npm run watch",
    "watch": "concurrently  \"npm run watch-ts\" \"npm run watch-node\"",
    ...
}

Vì vậy, điều này có nghĩa là tôi bắt đầu ứng dụng của mình với npm run start.

Bây giờ nếu tôi muốn vượt qua một số đối số, tôi sẽ bắt đầu với có thể:

npm run start -- --config=someConfig

Điều này làm là : npm run build && npm run watch -- --config=someConfig. Vấn đề với điều này là, nó luôn nối các đối số vào cuối tập lệnh. Điều này có nghĩa là tất cả các tập lệnh được xâu chuỗi không có được các đối số này (Các đối số có thể hoặc không thể được yêu cầu bởi tất cả, nhưng đó là một câu chuyện khác.). Hơn nữa khi các tập lệnh được liên kết được gọi thì các tập lệnh đó sẽ không nhận được các đối số được thông qua. tức là watchkịch bản sẽ không nhận được các đối số được thông qua.

Việc sử dụng sản xuất ứng dụng của tôi là như một .exe, vì vậy việc chuyển các đối số trong exe hoạt động tốt nhưng nếu muốn thực hiện điều này trong quá trình phát triển, điều đó thật đáng kinh ngạc.

Tôi không thể tìm thấy bất kỳ cách thích hợp để đạt được điều này, vì vậy đây là những gì tôi đã cố gắng.

Tôi đã tạo một tệp javascript: start-script.jsở cấp độ cha mẹ của ứng dụng, tôi có "default.package.json" và thay vì duy trì "pack.json", tôi duy trì "default.package.json". Mục đích của start-script.jsonlà để đọc default.package.json, trích xuất scriptsvà tìm kiếm npm run scriptnamesau đó nối các đối số đã truyền vào các tập lệnh này. Sau này, nó sẽ tạo một package.jsondữ liệu mới và sao chép dữ liệu từ default.package.json với các tập lệnh được sửa đổi và sau đó gọi npm run start.

const fs = require('fs');
const { spawn } = require('child_process');

// open default.package.json
const defaultPackage = fs.readFileSync('./default.package.json');
try {
    const packageOb = JSON.parse(defaultPackage);
    // loop over the scripts present in this object, edit them with flags
    if ('scripts' in packageOb && process.argv.length > 2) {

        const passedFlags = ` -- ${process.argv.slice(2).join(' ')}`;
        // assuming the script names have words, : or -, modify the regex if required.
        const regexPattern = /(npm run [\w:-]*)/g;
        const scriptsWithFlags = Object.entries(packageOb.scripts).reduce((acc, [key, value]) => {
            const patternMatches = value.match(regexPattern);
            // loop over all the matched strings and attach the desired flags.
            if (patternMatches) {
                for (let eachMatchedPattern of patternMatches) {
                    const startIndex = value.indexOf(eachMatchedPattern);
                    const endIndex = startIndex + eachMatchedPattern.length;
                    // save the string which doen't fall in this matched pattern range.
                    value = value.slice(0, startIndex) + eachMatchedPattern + passedFlags + value.slice(endIndex);
                }
            }
            acc[key] = value;
            return acc;
        }, {});
        packageOb.scripts = scriptsWithFlags;
    }

    const modifiedJSON = JSON.stringify(packageOb, null, 4);
    fs.writeFileSync('./package.json', modifiedJSON);

    // now run your npm start script
    let cmd = 'npm';
    // check if this works in your OS
    if (process.platform === 'win32') {
        cmd = 'npm.cmd';    // https://github.com/nodejs/node/issues/3675
    }
    spawn(cmd, ['run', 'start'], { stdio: 'inherit' });

} catch(e) {
    console.log('Error while parsing default.package.json', e);
}

Bây giờ, thay vì làm npm run start, tôi làmnode start-script.js --c=somethis --r=somethingElse

Việc chạy ban đầu có vẻ tốt, nhưng chưa được kiểm tra kỹ lưỡng. Sử dụng nó, nếu bạn muốn cho bạn phát triển ứng dụng.


1

Tôi đã tìm thấy câu hỏi này trong khi tôi đang cố gắng giải quyết vấn đề của mình bằng cách chạy hạt giống tuần tự: tạo lệnh cli:

node_modules/.bin/sequelize seed:generate --name=user

Hãy để tôi đi đến điểm. Tôi muốn có một lệnh script ngắn trong tệp pack.json của mình và để cung cấp đối số --name cùng một lúc

Câu trả lời được đưa ra sau một số thí nghiệm. Đây là lệnh của tôi trong pack.json

"scripts: {
  "seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}

... và đây là một ví dụ về việc chạy nó trong thiết bị đầu cuối để tạo tệp hạt giống cho người dùng

> yarn seed:generate --name=user

> npm run seed:generate -- --name=user

FYI

yarn -v
1.6.0

npm -v
5.6.0

2
Đây có phải là kỹ thuật tương tự như đã giải thích trong câu trả lời được chấp nhận trở lại vào năm 2013, để vượt qua -- --arg1, ...?
Dan Dascalescu

2
OK, tại sao lặp lại câu trả lời?
Dan Dascalescu

Tôi đã chia sẻ một ví dụ khác biệt về việc sử dụng, phải không?
Serge Seletskyy

2
Nếu tôi muốn chia sẻ một ví dụ khác cho một kỹ thuật đã được giải thích trong một câu trả lời khác, tôi sẽ thêm ví dụ của mình làm nhận xét cho câu trả lời đó.
Dan Dascalescu

1
gotcha, sẽ làm theo cách đó vào lần tới
Serge Seletskyy

0

npm chạy script_target - <argument> Về cơ bản đây là cách truyền các đối số dòng lệnh nhưng nó sẽ chỉ hoạt động trong trường hợp khi tập lệnh chỉ có một lệnh chạy như tôi đang chạy một lệnh tức là npm chạy start - 4200

"script":{
       "start" : "ng serve --port="
 }

Điều này sẽ chạy để truyền tham số dòng lệnh nhưng nếu chúng ta chạy nhiều hơn thì một lệnh cùng nhau như npm chạy build c: / workspace / file

"script":{
       "build" : "copy c:/file <arg> && ng build"
 } 

nhưng nó sẽ thông dịch như thế này trong khi chạy bản sao c: / file && ng build c: / work space / file và chúng tôi dự kiến ​​một cái gì đó giống như bản sao này c: / file c: / work space / file && ng build

Lưu ý: - vì vậy tham số dòng lệnh chỉ hoạt động quảng cáo dự kiến ​​trong trường hợp chỉ có một lệnh trong tập lệnh.

Tôi đã đọc một số câu trả lời ở trên trong đó một số trong số chúng đang viết rằng bạn có thể truy cập tham số dòng lệnh bằng ký hiệu $ nhưng điều này sẽ không hoạt động


0

Tôi biết đã có câu trả lời được phê duyệt, nhưng tôi thích cách tiếp cận JSON này.

npm start '{"PROJECT_NAME_STR":"my amazing stuff", "CRAZY_ARR":[0,7,"hungry"], "MAGICAL_NUMBER_INT": 42, "THING_BOO":true}';

Thông thường tôi có 1 var tôi cần, chẳng hạn như tên dự án, vì vậy tôi thấy điều này thật đơn giản.

Ngoài ra tôi thường có một cái gì đó như thế này trong gói.json của tôi

"scripts": {
    "start": "NODE_ENV=development node local.js"
}

Và tham lam tôi muốn "tất cả", NODE_ENV công cụ lập luận dòng CMD.

Bạn chỉ cần truy cập những thứ như vậy trong tệp của bạn (trong trường hợp của tôi là local.js)

console.log(process.env.NODE_ENV, starter_obj.CRAZY_ARR, starter_obj.PROJECT_NAME_STR, starter_obj.MAGICAL_NUMBER_INT, starter_obj.THING_BOO);

Bạn chỉ cần có bit này phía trên nó (Tôi đang chạy v10.16.0 btw)

var starter_obj = JSON.parse(JSON.parse(process.env.npm_config_argv).remain[0]);

Anyhoo, câu hỏi đã được trả lời. Tôi muốn chia sẻ, vì tôi sử dụng phương pháp này rất nhiều.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.