چطور میتوانیم از دستورات خط فرمان آرگومان دریافت کنیم؟ اگر دستور زیر را اجرا کنیم چه اتفاقی می افتد؟

node app.js print

با اجرای این دستور، فایل شما اجرا میشود و هیچ اتفاق دیگری نمیفتد، اما شما میتوانید کلمه print را به صورت آرگومان دریافت کنید و تصمیم بگیرید که مثلا اگر کاربر این دستور را وارد کرد چه اتفاقی بیفتد.

چطور به آرگومان های دستور دسترسی پیدا کنیم؟ به صورت زیر:

process.argv
console.log(process.argv)

ابتدا این دستور را بررسی کنید تا ببینید که argv یک آرایه است و عضو اول آن آدرس فایل اجرایی nodejs در سیستم عامل را برمیگرداند و عضو دوم آن آدرس فایل اجرایی برنامه شما را در خود نگه میدارد. عضو سوم به بعد از کاربر قابل دریافت است. مثلا در اولین مثال: کلمه print عضو سوم آرایه argv میشود. میتوانید دستور زیر را در فایل app.js قرار دهید و این مورد را امتحان کنید.

console.log(process.argv[2])

و حالا دستور زیر را در cmd وارد کنید:

node app.js print

مورد زیر را هم با مواردی که تا کنون آموختید بررسی کنید.

node app.js print --title="your name for example"

میتوانید از آرایه argv، یک لاگ بگیرید و نتایج را مشاهده کنید.

 

حالا که موارد فوق رو متوجه شدید، یه ماژول حرفه ای بهتون معرفی میکنم که خیلی راحت تر با آرگومان ها کار کنید. ماژول yargs رو به صورت زیر در پروژه خودتون قرار بدید و اون رو فراخوانی کنید.

npm install yargs --save
const yargs = require('yargs');
بررسی کنید
console.log(yargs);
console.log(yargs.argv);

و حالا دوباره دستور زیر رو بررسی کنید

node app.js print --title="your name for example"

متوجه تفاوت ها شدید؟ 

yargs به ما آبجکت تحویل میده، آرایه دستورات ارسال شده از خط فرمان با _ در آبجکت yargs در دسترس خواهد بود مثلا:

let firstCommand = yargs._[0];
console.log(firstCommand);
  نتیجه در مثال ما => print

نکته : اگر دستور به صورت زیر وارد شود، yargs چه واکنشی به آن نشان میدهد؟

node app.js print --title "mokhtar"
علامت = وارد نشده

yargs تشخیص میدهد که print یک دستور است و title به عنوان یک ورودی متغیر ارسال شده.

 

با همین اطلاعات میتوانیم برنامه های قابل اجرا با command line بنویسیم. فقط کافیست لیست دستورات مورد نظر خودمان را تعریف کنیم و اگر کاربر دستورات مورد نظر ما را وارد کرد، عملیات خاصی را اجرا کنیم و اگر مثلا داده ای وارد نشده بود یا نوع داده وارد شده با داده مورد نظر ما تناسب نداشت، یک پیغام خطا برای کاربر ارسال کنیم.

 

پکیج yargs محدود به توابع فوق نمی شود و کتابخانه ای غنی است . با مراجعه به مستندات آن میتوانید اطلاعات مفیدی بدست بیاورید. یکی از توابع دیگر yargs تابع commands است که میتوانیم توسط آن یک دستور کامند لاین بسازیم.

yargs
  .command('get', 'make a get HTTP request', {
    url: {
      alias: 'u',
      default: 'http://yargs.js.org/'
    }
  })
  .help()
  .argv

اگر در کنسول دستور زیر را تایپ کنیم:

node index.js --help

//---------------- نتیجه ------------------
index.js [command]

Commands:
  index.js get  make a get HTTP request

Options:
  --version  Show version number                                       [boolean]
  --help     Show help                                                 [boolean]

برای آرگومانهایی هم که میخوایم دریافت کنیم، خواص مختلفی وجود داره که باعث میشه بتونیم مثل فیلد باهاشون برخورد کنیم.مثلاً:

yargs
  .command('print', 'this is my test', {
    body:{
        describe:'i am descripttion of print bode',
        demand:true,
        alias:'p'
    }
  })
  .help()
  .argv

describe : توضیحات مربوط به فیلد body هست.

demand : آیا پر کردن این فیلد برای اجرای دستور الزامی است؟

alias : میتونیم یه مخفف هم برای دستورمون در نظر بگیریم در مثال ما مثلا print-- میتونه p-- هم باشه.