ساخت ابزار cli با nodejs

ترمینال خیلی جای خوبیه. البته منظورم ترمینال جنوب نیست، منظورم از ترمینال، کنسول یا پاورشل یا کامندلاین یا cmd یا بنا بر گفته بسیاری از مهندسان حال حاضر دنیا، همون داس هستش. من هم توی این پست میخوام ساخت یه ابزار واسه اون رو یاد بدم. جوری که دیگه به جای باز کردن مای‌کامپیوتر و…، با تایپ اسم ابزار خودمون و پاس دادن آرگومنت‌هامون بهش، عملیات مورد نظرمون انجام بشه. اونم با جاواسکریپت و نود‌جی‌اس. لایک عه باس.

شروع به نوشتن

پروژه‌مون رو مثل یه برنامه عادی با نوشتن کامندهای زیر شروع می‌کنیم:

mkdir my-project
cd my-project

حالا یه فایل می‌سازیم به اسم package.json و محتویات زیر رو داخلش قرار می‌دیم.

{
  "name": "my-project",
  "version": "0.0.1",
  "bin": {
    "my-project": "index.js"
  }
}

البته ما با npm init هم می‌تونستیم این فایل رو بسازیم، اما ظاهرا این کامند نمی‌تونه keyهای خاص ما رو قبول کنه. یکی از این keyها، bin هستش که توش میگیم وقتی کاربر توی ترمینالش تایپ کرد my-project، اسکریپت ما اجرا بشه.

حالا توی فولدر فوق، فایل index.js که درواقع اسکریپت اصلی برنامه خودمون هست رو ایجاد میکنیم و توش محتویات زیر رو مینویسیم:

#!/usr/bin/env node
console.log("salam");

این یه برنامه سادست که به محض اجرا، عبارت salam رو نمایش می‌ده. فقط حواستون باشه که خط اول این اسکریپت خیلی مهمه. این خط به سیستم‌عامل می‌فهمونه که از node برای اجرای دستورات بعدی این فایل استفاده کنه. چون همون‌طور که می‌دونید این اسکریپت مستقیم توسط سیستم‌عامل قراره اجرا بشه و ما قرار نیست همیشه با node index.js اون رو اجرا کنیم. برای شروع، دونستن همین کافیه. ولی اگر گیک درونتون بی‌تابی می‌کنه، می‌تونید از اینجا بیشتر بخونید راجع بهش.

خب حالا برای تست، توی ترمینال می‌نویسیم:

node index.js

و ترمینال هم برای پاسخ به زحمات ما، به ما سلام می‌کنه!

اما این خیلی ساده بود. مطمئنم تا اینجاش رو خودتون می‌دونستید. اما الان قراره چیزهای مهم‌تری رو بگم. مثل آرگومنت‌ها که به این برنامه قراره پاس داده بشن. کامند cd رو در نظر بگیرید. ما توی ترمینال همیشه در ادامه تایپ این کامند، آدرس دایرکتوری مورد نظرمون رو می‌نویسیم. مثلا cd ./felan. این آدرس، یه آرگومنت هستش که به این برنامه پاس داده می‌شه. حالا ما هم می‌خوایم به برناممون آرگومنت پاس بدیم. پس دوباره فایل index.js رو باز کنید و این تغییرات رو روش اعمال کنید.

#!/usr/bin/env node
console.log("salam " + process.argv[2] );

حالا توی ترمینال، به جای دستور قبلی می‌نویسیم:

node index.js amir

و این بار ترمینال اون آرگومان ما رو هم چاپ می‌کنه! اما یه سوال، اون process.argv چی بود؟ الان می‌گم. آبجکت process توی برنامه‌های node ما در دسترسه. توی این آبجکت اطلاعاتی مثل دایرکتوری کنونی و آدرس فولدر کاربر و آرگومنت‌های تایپ‌شده و متودهایی مثل بستن برنامه و ایونت‌هایی مثل قبل از بسته‌شدن و اینها قرارداره. چیزی که ما ازش استخراج کردیم، argv یا همون آرگومنت‌های تایپ‌شدههست که در واقع یه لیست از آرگومنت‌های تایپ‌شده کاربر توی ترمیناله. توی این لیست همیشه خانه 0 برابر با خود اسکریپت node و خانه 1 برابر با اسکریپت ما یا همون index.js هست. پس از خانه 2 به بعد، تمام آیتم‌ها همون آرگومنت‌هایی هستن که به برنامه ما پاس داده شدن. همینطور که توی مثال دیدید.

پس چرا هنوز کامند my-project فعال نشده؟

بخاطر اینکه این پروژه هنوز هیچ‌جا نصب نیست. یادتون نره که این یک پروژه node هستش و ما نیازی نداریم جایی environment ست کنیم، فقط باید این پکیج رو به صورت گلوبال روی سیستم نصب کنیم. پس با اجرای کامند زیر توی ترمینال، این کار رو می‌کنیم و بعدش وقتی توی ترمینال نوشتیم my-project salam دیگه سیستم‌عامل به ما خطای command not found نمی‌ده، چون node می‌پره وسط و به سیستم‌عامل می‌گه که منظور کاربر از این کامند در واقع همون برنامه ماست (دوغ):

npm install -g

البته ما قرار نیست همینجا متوقف بشیم و با نوشتن برنامه سلام کردن به کاربر از دنیای برنامه‌نویسی خداحافظی کنیم، ما قراره برنامه‌های خفن‌تری بنویسیم. این دوتا لینک هم قراره مطالعه کنیم، چون توضیح کاملشون توی این پست نمی‌گنجید. :D

حرف آخر

امیدوارم از این آموزش خوشتون اومده باشه و مورد استفادتون قرار بگیره و یا حداقل انگیزه‌ای شده باشه برای شروع نوشتن برنامه‌های جالبی که توی ذهنتون دارید. اگر هم نظری یا انتقادی در مورد این پست دارید، درهای کامنت و PR همیشه به روی شما باز است.