Повысьте свою производительность, создав собственную команду CLI с помощью TypeScript (2 серии деталей)
Контекст
Ваш Ежедневная производительность может быть значительно улучшен 🚀 Если вы можете автоматизировать Все задачи, которые вы раньше выполняли.
Спасибо Узел, NPM, NPX и TypeScript : Создание CLI Command И сделать его доступным в вашей системе или во всем мире никогда не было проще.
В качестве примера мы создадим команду CLI, чтобы получить стоимость запаса для символа. Эта команда будет называться пике-сус (как ссылка на персонажа Диснея «Дядя $ Crooge» на французском языке 😄 🦆 🦆 🦆 🦆 🦆 🦆 🦆 🦆 🦆
$ pique-sous MSFT SFIX GOOG
Результат:
Retrieving stock information for MSFT at date 2021-01-10T01:37:57.574Z
{
language: 'en-US',
region: 'US',
quoteType: 'EQUITY',
quoteSourceName: 'Delayed Quote',
regularMarketOpen: 218.68,
exchange: 'NMS',
shortName: 'Microsoft Corporation',
longName: 'Microsoft Corporation',
messageBoardId: 'finmb_21835',
exchangeTimezoneName: 'America/New_York',
exchangeTimezoneShortName: 'EST',
gmtOffSetMilliseconds: -18000000,
market: 'us_market',
esgPopulated: false,
displayName: 'Microsoft',
symbol: 'MSFT'
}
Окончательные результаты доступны в https://github.com/raphaelmansuy/pique-sous и опубликовано в https://www.npmjs.com/package/pique-sous Анкет
Эта статья была первоначально опубликована в https://www.elitizon.com/
🏗 6 Простых шагов, чтобы это произошло!
Шаг 1: Создание базового проекта TypeScript
✅ Создать каталог под названием пике-сумасшедшие
$ mkdir ./pique-sous
✅ Создайте файл index.ts под пике-сумасшедшие
$ cd ./pique-sous $ touch ./index.ts
В результате вы должны иметь:
pique-sous └── index.ts
✅ Редактировать index.ts и добавьте простую команду для тестирования, например:
const currentDateAndTime = new Date().toIsoString() console.log(currentDateTime)
✅ Выполните и протестируйте файл с помощью TS-узла
npx ts-node index.ts
npx это инструмент из реестра NPM, позволяющий выполнять команды без установки TS-Node TypeScript — это версия узла, поддерживающая TypeScript
В результате у вас должно быть что -то вроде этого:
2021-01-10T02:37:49.683Z
Шаг 2: Сделайте исполняемый файл
✅ Измените index.ts Файл, такой как
#!/usr/bin/env npx ts-node const currentDateAndTime = new Date().toIsoString() console.log(currentDateTime)
Первая строка #!/usr/bin/env npx ts-node указывает, что файл должен быть выполнен NPX и TS-узлом
✅ Добавить Исполняемая разрешение к index.ts файл
$ chmod u+x ./index.ts
✅ Проверьте файл
$ ./index.ts
Полученные результаты:
$ ./index.ts $ 2021-01-10T03:24:43.190Z
Шаг 3: Пакет проекта
✅ Добавить файл package.json
Внутри каталога используйте команду NPM для создания файла package.json
$ npm init
Ответь на вопросы:
package name: (pique-sous)
version: (1.0.0)
description: A simple package
entry point: (index.js) bin/index.js
test command:
git repository:
keywords:
author: raphael mansuy
license: (ISC) MIT
About to write to /Users/raphaelmansuy/Projects/Github/raphaelmansuy/ElitizonWeb/data/blog/2021/01-09-how-to-create-a-cli-command-with-typescript/steps/step01/pique-sous/package.json:
{
"name": "pique-sous",
"version": "1.0.0",
"description": "A simple package",
"main": "bin/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "raphael mansuy",
"license": "MIT"
}
✅ Настройте компиляцию из TypeScript в JavaScript
Создайте файл с именем tsconfig.json следующим образом:
{
"compilerOptions": {
"module": "commonjs",
"target": "es2017",
"lib": ["es2015"],
"moduleResolution": "node",
"sourceMap": true,
"outDir": "bin",
"baseUrl": ".",
"paths": {
"*": ["node_modules/*", "src/types/*"]
},
"emitDecoratorMetadata": true,
"experimentalDecorators": true
},
"include": ["src/**/*"]
}
✅ Создать SRC каталог и перемещать index.ts в ./SRC каталог
$ mkdir ./src $ mv ./index.ts ./src
Полученные результаты:
. ├── package.json ├── src │ └── index.ts └── tsconfig.json 1 directory, 3 files
✅ Добавить поддержку TypeScript для компиляции
$ yarn add typescript @types/node -D
Результат:
yarn add v1.22.10 info No lockfile found. [1/4] 🔍 Resolving packages... [2/4] 🚚 Fetching packages... [3/4] 🔗 Linking dependencies... [4/4] 🔨 Building fresh packages... success Saved lockfile. success Saved 2 new dependencies. info Direct dependencies ├─ @types/node@14.14.20 └─ typescript@4.1.3 info All dependencies ├─ @types/node@14.14.20 └─ typescript@4.1.3 ✨ Done in 1.44s.
Package.json должен выглядеть так:
{
"name": "pique-sous",
"version": "1.0.0",
"description": "A simple package",
"main": "bin/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "raphael mansuy",
"license": "MIT",
"devDependencies": {
"@types/node": "^14.14.20",
"typescript": "^4.1.3"
}
}
✅ Редактировать Package.json следующим образом
👉 Добавить вход «bin» со значением «bin/index.js» 👉 👉 Добавить команду «сборка» в «Скрипты»
{
"name": "pique-sous",
"version": "1.0.0",
"description": "A simple package",
"main": "bin/index.js",
"bin": "bin/index.js",
"scripts": {
"build": "tsc",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "raphael mansuy",
"license": "MIT",
"devDependencies": {
"@types/node": "^14.14.20",
"typescript": "^4.1.3"
}
}
✅ Редактировать index.ts следующим образом
👉 Замените NPX TS-Node Node, потому что результатом компиляции компилятора TypeScript будет файл JavaScript
#!/usr/bin/env node const currentDateTime = new Date().toISOString() console.log(currentDateTime)
✅ Строить
yarn build
Полученные результаты:
yarn run v1.22.10 $ tsc ✨ Done in 1.66s.
Справочник Bin теперь содержит результат процесса компиляции:
$ tree ./bin ./bin ├── index.js └── index.js.map 0 directories, 2 files
✅ сделать ./bin/index.js исполняемый файл
chmod u+x ./bin/index.js
✅ Проверьте результат
./bin/index.js
Результат:
❯ pique-sous 2021-01-10T04:33:08.303Z
Шаг 4: Публикуйте команду локально
🔥 Команда теперь может быть доступна для использования локально:
$ yarn link --global
Результат:
yarn link v1.22.10 success Registered "pique-sous". info You can now run `yarn link "pique-sous"` in the projects where you want to use this package and it will be used instead. ✨ Done in 0.04s.
🎉 💪 Теперь мы можем использовать команду повсюду
❯ pique-sous 2021-01-10T05:45:10.586Z
🌈 🙈 Мы можем перерегистрировать команду:
$ yarn unlink --global
Шаг 5: опубликовать команду CLI на www.npmjs.org
👉 Во -первых, вам нужно зарегистрироваться и создать учетную запись на https://www.npmjs.com/ 👉.
Введите следующую команду в базовом каталоге:
$ npm publish
Введите свои учетные данные NPM
Результат:
npm notice npm notice 📦 pique-sous@1.0.0 npm notice === Tarball Contents === npm notice 133B bin/index.js npm notice 198B bin/index.js.map npm notice 372B package.json npm notice 100B src/index.ts npm notice 364B tsconfig.json npm notice === Tarball Details === npm notice name: pique-sous npm notice version: 1.0.0 npm notice filename: pique-sous-1.0.0.tgz npm notice package size: 810 B npm notice unpacked size: 1.2 kB npm notice shasum: 6c8aea7b85c125a2d9dbbeec81d15ef94b07240a npm notice integrity: sha512-ozbnViT18DSUI[...]FquBcXBSV8f2g== npm notice total files: 5 npm notice
Ваша команда теперь опубликована на NPM и быть установленным или выполненным повсюду.
Пример:
Выполнение без официальной установки:
npx pique-sous
Или глобальная установка:
npm install -g pique-sous
Шаг 6: Добавить Yahoo Finance Получить информацию о акциях
✅ Установите библиотеку Axios
yarn add axios
✅ Добавить файл ./src/getstock.ts
import axios from "axios"
export const getSingleStockInfo = async (stock: string) => {
if (!stock) {
throw new Error("Stock symbol argument required")
}
if (typeof stock !== "string") {
throw new Error(
`Invalid argument type for stock argument. Required: string. Found: ${typeof stock}`
)
}
const url = `https://query1.finance.yahoo.com/v7/finance/quote?symbols=${stock}`
const res = await axios.get(url)
const { data } = res
if (
!data ||
!data.quoteResponse ||
!data.quoteResponse.result ||
data.quoteResponse.result.length === 0
) {
throw new Error(`Error retrieving info for symbol ${stock}`)
}
const quoteResponse = data.quoteResponse.result[0]
return quoteResponse
}
✅ Добавить файл «./src/getversion.ts»
import * as fs from "fs"
import * as Path from "path"
export const getVersion = () => {
const packageJSONPath = Path.resolve(__dirname, "../package.json")
const content = fs.readFileSync(packageJSONPath, { encoding: "utf8" })
const config = JSON.parse(content)
return config.version
}
✅ Изменить ./src/index.ts
#!/usr/bin/env node
import { getSingleStockInfo } from "./getStock"
import { getVersion } from "./getVersion"
/**
* return the arguments of the command except node and index.ts
*/
const getArgs = () => {
// We retrieve all the command argumnts except the first 2
const args = process.argv.slice(2)
return args
}
/**
* Command Help
*/
const printCommandHelp = () => {
const version = getVersion()
const help = `
pique-sous (version: ${version})
A simple command to retrieve stock information.
Example:
$ pique-sous MSFT SFIX GOOG
`
console.log(help)
}
const symbols = getArgs()
// Print help if no arguments
if (symbols.length === 0) {
printCommandHelp()
getVersion()
process.exit(0)
}
const now = new Date().toISOString()
// Call the yahoo API for each symbol and display the result on the console
symbols.forEach((symbol) => {
console.log(`Retrieving stock information for ${symbol} at date ${now}`)
getSingleStockInfo(symbol).then(console.log)
})
✅ Увеличьте номер версии в package.json до 1.1.0 («Версия»)
{
"devDependencies": {
"@types/axios": "^0.14.0",
"@types/node": "^14.14.20"
},
"name": "pique-sous",
"version": "1.1.0",
"description": "A simple command to retrieve stock information",
"main": "./bin/index.js",
"dependencies": {
"axios": "^0.21.1",
"typescript": "^4.1.3"
},
"bin": "bin/index.js",
"scripts": {
"build": "tsc",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"cli",
"node",
"typescript",
"npm",
"stock",
"yahoo finance"
],
"contributors": [
"raphaelmansuy"
],
"repository": {
"url": "https://github.com/raphaelmansuy/pique-sous.git",
"type": ""
},
"author": {
"email": "raphael.mansuy@gmail.com",
"name": "raphaelmansuy"
},
"license": "MIT"
}
✅ Создайте новую версию
$ yarn build
✅ Проверка локально
Публикуйте компонент:
$ yarn link --global
✅ Выполнять
$ pique-sous MSFT
Результат:
Retrieving stock information for MSFT at date 2021-01-10T06:11:41.305Z
{
language: 'en-US',
region: 'US',
quoteType: 'EQUITY',
quoteSourceName: 'Delayed Quote',
triggerable: true,
currency: 'USD',
exchange: 'NMS',
shortName: 'Microsoft Corporation',
longName: 'Microsoft Corporation',
messageBoardId: 'finmb_21835',
exchangeTimezoneName: 'America/New_York',
exchangeTimezoneShortName: 'EST',
gmtOffSetMilliseconds: -18000000,
...
🔥🔥🔥 Пакет теперь может быть переиздан на npm 💪.
Повысьте свою производительность, создав собственную команду CLI с помощью TypeScript (2 серии деталей)
Оригинал: «https://dev.to/raphaelmansuy/boost-your-productivity-by-creating-your-own-cli-command-with-typescript-part-1-5g37»