از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش ایجاد یک برنامه Node.js CLI یکی از موارد مورد علاقه من در مورد Node این است که چقدر آسان است که ابزارهای رابط خط فرمان ساده (CLI) ایجاد کنید. Node بین تجزیه آرگومان با yargs تا مدیریت ابزارها با npm کار را آسان می کند. چند نمونه از انواع ابزارهایی که من به آنها اشاره می کنم عبارتند از: forever uglifyjs is-up-cli…
سرفصلهای مطلب
یکی از چیزهای مورد علاقه من در مورد Node این است که چگونه می توان ابزارهای رابط خط فرمان ساده (CLI) ایجاد کرد. بین تجزیه آرگومان با یارگ ها برای مدیریت ابزارها با npm، Node این کار را آسان می کند.
چند نمونه از انواع ابزارهایی که من به آنها اشاره می کنم عبارتند از:
هنگام نصب (با -g
گزینه)، این بسته ها را می توان از هر جایی اجرا کرد روی خط فرمان و بسیار شبیه ابزارهای داخلی یونیکس کار می کند.
من اخیراً چند برنامه Node.js برای خط فرمان ایجاد کرده ام و فکر می کنم نوشتن یک پست ممکن است مفید باشد. روی برای کمک به شما برای شروع بنابراین در طول این مقاله به شما نشان میدهم که چگونه یک ابزار خط فرمان ایجاد کنید تا دادههای مکان را برای آدرسهای IP و URLها دریافت کنید.
اگر مقاله رسانگار را دیده اید روی با یادگیری Node.js، ممکن است به یاد داشته باشید که ما یک بسته به نام ایجاد کردیم twenty
که عملکرد مشابهی داشت. ما از آن پروژه ساخته شده و آن را به یک ابزار CLI مناسب با عملکرد بیشتر تبدیل خواهیم کرد.
راه اندازی پروژه
بیایید با ایجاد یک دایرکتوری جدید و راه اندازی پروژه با استفاده از npm شروع کنیم:
$ mkdir twenty
$ npm init
اینتر را برای تمام دستورات آخرین دستور فشار دهید، و شما باید خود را داشته باشید package.json
فایل.
توجه داشته باشید که از آنجایی که من قبلاً نام بسته را گرفته ام twenty
روی npm، اگر واقعاً می خواهید منتشر کنید، باید نام آن را به چیز دیگری تغییر دهید. یا شما همچنین می توانید محدوده پروژه شما
سپس، ایجاد کنید index.js
فایل:
$ touch index.js
این تنها چیزی است که در حال حاضر برای شروع به آن نیاز داریم و در حین حرکت به پروژه اضافه خواهیم کرد روی.
تجزیه آرگومان ها
اکثر برنامههای CLI آرگومانهایی را از کاربر دریافت میکنند که رایجترین روش دریافت ورودی است. برای اکثر موارد، تجزیه آرگومان ها چندان دشوار نیست زیرا معمولاً تعداد انگشت شماری از دستورات و پرچم ها وجود دارد. اما با پیچیدهتر شدن ابزار، پرچمها و دستورات بیشتری اضافه میشوند و تجزیه آرگومان میتواند به طرز شگفتآوری دشوار شود.
برای کمک به ما در این زمینه، از بسته ای به نام استفاده خواهیم کرد yargs
، که جانشین محبوب است خوش بین بسته بندی
yargs
برای کمک به شما در تجزیه دستورات کاربر ایجاد شده است، مانند این:
var argv = require('yargs').argv;
در حال حاضر optstrings پیچیده مانند node index.js install -v --a=22 -cde -x derp
به راحتی قابل دسترسی است:
var argv = require('yargs').argv;
argv._(0) // 'install'
argv.v // true
argv.a // 22
argv.c // true
argv.d // true
argv.e // true
argv.x // 'derp'
yargs
حتی در تعیین رابط فرمان به شما کمک می کند، بنابراین اگر ورودی کاربر الزامات خاصی را برآورده نکند، یک پیام خطا به آنها نشان می دهد. بنابراین، برای مثال، می توانیم بگوییم yargs
حداقل 2 آرگومان می خواهیم:
var argv = require('yargs')
.demand(2)
.argv
و اگر کاربر حداقل دو مورد را ارائه ندهد، این پیام خطای پیشفرض را مشاهده میکند:
$ node index.js foo
Not enough non-option arguments: got 1, need at least 2
چیزهای بیشتری وجود دارد yargs
به غیر از این، بنابراین برای اطلاعات بیشتر به readme مراجعه کنید.
برای twenty
، چند آرگومان اختیاری مانند آدرس IP و برخی پرچم ها را در نظر خواهیم گرفت. در حال حاضر، ما استفاده خواهیم کرد yargs
مثل این:
var argv = require('yargs')
.alias('d', 'distance')
.alias('j', 'json')
.alias('i', 'info')
.usage('Usage: $0 (options)')
.example('$0 -d 8.8.8.8', 'find the distance (km) between you and Google DNS')
.describe('d', 'Get distance between IP addresses')
.describe('j', 'Print location data as JSON')
.describe('i', 'Print location data in human readable form')
.help('h')
.alias('h', 'help')
.argv;
از آنجایی که هیچ یک از استدلال های ما مورد نیاز نیست، ما از آن استفاده نخواهیم کرد .demand()
، اما ما استفاده می کنیم .alias()
، که می گوید yargs
که کاربر می تواند از فرم کوتاه یا بلند هر پرچم استفاده کند. ما همچنین برخی از اسناد راهنما را اضافه کردهایم تا زمانی که کاربر به آن نیاز دارد نشان دهد.
ساختار برنامه
حالا که میتوانیم ورودی را از کاربر دریافت کنیم، چگونه آن ورودی را بگیریم و آن را به یک دستور با آرگومانهای اختیاری ترجمه کنیم؟ چند ماژول برای کمک به شما در انجام این کار طراحی شده است، از جمله:
با بسیاری از این چارچوب ها، تجزیه آرگومان در واقع برای شما انجام می شود، بنابراین حتی نیازی به استفاده از آن ندارید yargs
. و در commander
در مورد، بسیاری از عملکرد آن بسیار شبیه است yargs
، اگرچه راه هایی برای مسیریابی دستورات به توابع ارائه می دهد.
از آنجایی که برنامه ما نسبتاً ساده است، فقط به استفاده از آن ادامه می دهیم yargs
در حال حاضر
اضافه کردن کد
ما زمان زیادی را در اینجا صرف نمی کنیم زیرا فقط مختص برنامه CLI ما است، اما در اینجا کد مخصوص برنامه ما آمده است:
var dns = require('dns');
var request = require('request');
var ipRegex = /(25(0-5)|2(0-4)(0-9)|(01)?(0-9)(0-9)?)\.(25(0-5)|2(0-4)(0-9)|(01)?(0-9)(0-9)?)\.(25(0-5)|2(0-4)(0-9)|(01)?(0-9)(0-9)?)\.(25(0-5)|2(0-4)(0-9)|(01)?(0-9)(0-9)?)/;
var toRad = function(num) {
return num * (Math.PI / 180);
};
var getIpInfo = function(server, callback) {
var ipinfo = function(p, cb) {
request('http://ipinfo.io/' + p, function(err, response, body) {
var json = JSON.parse(body);
cb(err, json);
});
};
if (!server) {
return ipinfo('json', callback);
} else if (!server.match(ipRegex)) {
return dns.lookup(server, function(err, data) {
ipinfo(data, callback);
});
} else {
return ipinfo(server, callback);
}
};
var ipDistance = function(lat1, lon1, lat2, lon2) {
// Earth radius in km
var r = 6371;
var dLat = toRad(lat2 - lat1);
var dLon = toRad(lon2 - lon1);
lat1 = toRad(lat1);
lat2 = toRad(lat2);
var a = Math.sin(dLat / 2.0) * Math.sin(dLat / 2.0) +
Math.sin(dLon / 2.0) * Math.sin(dLon / 2.0) * Math.cos(lat1) * Math.cos(lat2);
var c = 2.0 * Math.atan2(Math.sqrt(a), Math.sqrt(1.0 - a));
return r * c;
};
var findLocation = function(server, callback) {
getIpInfo(server, function(err, data) {
callback(null, data.city + ', ' + data.region);
});
};
var findDistance = function(ip1, ip2, callback) {
var lat1, lon1, lat2, lon2;
getIpInfo(ip1, function(err, data1) {
var coords1 = data1.loc.split(',');
lat1 = Number(coords1(0));
lon1 = Number(coords1(1));
getIpInfo(ip2, function(err, data2) {
var coords2 = data2.loc.split(',');
lat2 = Number(coords2(0));
lon2 = Number(coords2(1));
var dist = ipDistance(lat1, lon1, lat2, lon2);
callback(null, dist);
});
});
};
برای کد منبع کامل، می توانید مخزن را پیدا کنید اینجا.
تنها کاری که باید با کد انجام دهیم این است hook آرگومان های CLI را با کد برنامه بالا بالا ببرید. برای سهولت، همه اینها را در تابعی به نام قرار می دهیم cli()
، که بعدا از آن استفاده خواهیم کرد.
کپسوله کردن تجزیه آرگومان و نگاشت دستور در داخل cli()
به جدا نگه داشتن کد برنامه کمک می کند، بنابراین به این کد اجازه می دهد تا به عنوان یک کتابخانه با آن وارد شود require()
.
var cli = function() {
var argv = require('yargs')
.alias('d', 'distance')
.alias('j', 'json')
.alias('i', 'info')
.usage('Usage: $0 (IP | URL) (--d=IP | URL) (-ij)')
.example('$0 -d 8.8.8.8', 'find the distance (km) between you and Google DNS')
.describe('d', 'Get distance between IP addresses')
.describe('j', 'Print location data as JSON')
.describe('i', 'Print location data in human readable form')
.help('h')
.alias('h', 'help')
.argv;
var path = 'json';
if (argv._(0)) {
path = argv._(0);
}
if (argv.d) {
findDistance(path, argv.d, function(err, distance) {
console.log(distance);
});
} else if (argv.j) {
getIpInfo(path, function(err, data) {
console.log(JSON.stringify(data, null, 4));
});
} else if (argv.i) {
getIpInfo(path, function(err, data) {
console.log('IP:', data.ip);
console.log('Hostname:', data.hostname);
console.log('City:', data.city);
console.log('Region:', data.region);
console.log('Postal:', data.postal);
console.log('Country:', data.country);
console.log('Coordinates:', data.loc);
console.log('ISP:', data.org);
});
} else {
findLocation(path, function(err, location) {
console.log(location);
});
}
};
exports.info = getIpInfo;
exports.location = findLocation;
exports.distance = findDistance;
exports.cli = cli;
در اینجا می توانید ببینید که ما اساساً فقط از آن استفاده می کنیم if...else
عباراتی برای تعیین اینکه کدام دستور اجرا شود. شما میتوانید خیلی جذابتر شوید و از Flatiron برای نگاشت رشتههای regex به دستورات استفاده کنید، اما این برای کاری که ما در اینجا انجام میدهیم کمی بیش از حد است.
قابل اجرا شدن
برای اینکه بتوانیم برنامه را اجرا کنیم، باید چند مورد را در برنامه خود مشخص کنیم package.json
فایل، مانند جایی که فایل اجرایی در آن قرار دارد. اما ابتدا اجازه دهید فایل اجرایی و کد آن را ایجاد کنیم. یک فایل به نام ایجاد کنید twenty
در دایرکتوری twenty/bin/
و این را به آن اضافه کنید:
#!/usr/bin/env node
require('../index').cli();
شبانگ (#!/usr/bin/env node
) به یونیکس می گوید که چگونه فایل را اجرا کند و به ما اجازه می دهد فایل را کنار بگذاریم node
پیشوند خط دوم فقط کد را از بالا بارگذاری می کند و با آن تماس می گیرد cli()
تابع.
که در package.json
، JSON زیر را اضافه کنید:
"bin": {
"twenty": "./bin/twenty"
}
این فقط به npm می گوید که در هنگام نصب بسته با the، فایل اجرایی را کجا پیدا کند -g
پرچم (جهانی).
خب حالا اگه نصب کردی twenty
به عنوان جهانی …
$ npm install -g twenty
سپس می توانید مکان سرورها و آدرس های IP را دریافت کنید:
$ twenty 198.41.209.141 #reddit
San Francisco, California
$ twenty rackspace.com
San Antonio, Texas
$ twenty usa.gov --j
{
"ip": "216.128.241.47",
"hostname": "No Hostname",
"city": "Phoenix",
"region": "Arizona",
"country": "US",
"loc": "33.3413,-112.0598",
"org": "AS40289 CGI TECHNOLOGIES AND SOLUTIONS INC.",
"postal": "85044"
}
$ twenty rasanegar.com
Ashburn, Virginia
و در اینجا شما آن را دارید، سرور رسانگار در Asburn، ویرجینیا واقع شده است. جالب =)
برای کد منبع کامل، پروژه را بررسی کنید روی Github.
(برچسبها برای ترجمه)# جاوا اسکریپت
منتشر شده در 1403-01-29 06:25:03