Повысьте свою производительность, создав собственную команду 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»