- डेवलपमेंट टीम के लिए संगठन के ज्ञान को इकट्ठा करने और सुरक्षित रखने का एक उपयोगी तरीका है उपयोगी snippets, scripts, या workflows के संग्रह को लगातार बढ़ाना
- इसलिए कई repositories में Makefile, bash scripts जैसी चीज़ें बनाई जाती हैं
- लेकिन पूरे संगठन में उपयोगी tools install करना, boilerplate code generate करना, या ऐसे जटिल AWS commands चलाना जिन्हें कोई याद नहीं रखता, यह कैसे किया जाए?
- Slack या Shopify जैसी कुछ कंपनियों के अपने internal CLI होते हैं
- आधुनिक terminal Warp में workflows को document और share करने की सुविधा होती है
- संगठन के आंतरिक उपयोग के लिए CLI आसानी से बनाया जा सकता है। उदाहरण के तौर पर
acme नाम की कंपनी के लिए CLI बनाकर देखते हैं
CLI डिज़ाइन आवश्यकताएँ
acme <command> के जरिए कहीं से भी command चलाने के लिए एक common entry point हो
- हर developer किसी खास repository में पहले जाए बिना, कहीं से भी
acme <command> चलाकर command trigger कर सके
- developers नए commands आसानी से contribute कर सकें
acme update से नए versions आसानी से deploy किए जा सकें
- cross-platform support हो (उदाहरण:
acme download something चलाने पर Linux में curl, Windows में Invoke-WebRequest इस्तेमाल हो)
acme list से उपलब्ध commands की सूची और उनका छोटा description देखा जा सके
just का उपयोग करके project शुरू करना
- just
make जैसा है, लेकिन commands चलाने पर विशेष रूप से केंद्रित एक tool है
- यह cross-platform support देता है और platform-specific commands भी चला सकता है
- दूसरे विकल्पों में Slack का
magic-cli (अगर आपको Ruby अच्छी तरह आती है तो शुरुआत के लिए बेहतरीन) या make शामिल हैं
project सेट करना
just install करें। यहाँ दिए गए निर्देशों का पालन करें
~/acme/cli folder बनाएं और root में नीचे दिया गया justfile जोड़ें:
default:
just --list
# arch와 os 이름 표시
os-info:
echo "Arch: {{arch()}}"
echo "OS: {{os()}}"
just के docs में commands को "recipes" कहा जाता है
- अगर recipes के बिना
just चलाया जाए, तो justfile की पहली recipe चलती है। आम तौर पर पहली recipe का नाम default रखना एक सामान्य pattern है
$ just
just --list
Available recipes:
default
os-info # Show arch and os name
default recipe, just list चलाती है। यह सभी recipes की सूची और comments दिखाती है
default recipe को hide करना बेहतर है
- recipe चलाने पर हर command, execute होने से पहले print होती है।
@ prefix से इस output को हटाया जा सकता है। यह Makefile जैसा ही है
[private]
@default:
just --list
# arch와 os 이름 표시
@os-info:
echo "Arch: {{arch()}}"
echo "OS: {{os()}}"
acme alias बनाना
नई recipe लिखना
सरल recipe
platform-specific recipe
systemd जैसे tool वाले snippets केवल उन developers को दिखें जो Linux machine इस्तेमाल कर रहे हों
[linux] attribute का उपयोग करके recipe को केवल Linux में expose किया जा सकता है
[linux]
@list-systemd-services:
systemctl list-units --type=service
cross-platform recipe
script recipe
- recipe में पूरा script embed किया जा सकता है
- Shebang(
#!) से शुरू होने वाली recipe अलग file के रूप में save होकर run होती है
- यह तब उपयोगी है जब workflow में थोड़ी अधिक जटिल logic चाहिए, जैसे control flow (if-else, loops), variables को store और manipulate करना आदि
# Say hello world in sh
hello-world-sh:
#!/usr/bin/env sh
hello='Yo'
echo "$hello from a shell script!"
- इसका मतलब है कि आप शक्तिशाली scripting capabilities वाली programming language का उपयोग कर सकते हैं। कुछ काम Bash की तुलना में Python में आसान हो सकते हैं
# scale jpg image by 50%
[no-cd]
scale-jpg path:
#!/usr/bin/env python3
import PIL.Image
image = PIL.Image.open("{{path}}")
factor = 0.5
image = image.resize((round(image.width * factor), round(image.height * factor)))
image.save("{{path}}.s50.jpg")
- हर developer के कंप्यूटर में Python install हो, यह ज़रूरी नहीं है, और install होने पर भी pillow मौजूद हो यह भी ज़रूरी नहीं।
nix का उपयोग करके dependencies सहित script चलाया जा सकता है:
# scale jpg image by 50%
[no-cd]
scale-jpg path:
#! /usr/bin/env nix-shell
#! nix-shell -i python3 -p python3Packages.pillow
import PIL.Image
...
recipes deploy करना
- अपना deployment mechanism बनाने के बजाय
git का उपयोग करें
- GitHub पर repository बनाएं और अब तक का काम push करें
$ git init
$ git commit -m "first commit"
$ git branch -M main
$ git remote add origin git@github.com:acme/cli.git
$ git push -u origin main
- अब जिस किसी के पास इस repository की access है, वह PR बनाकर changes contribute कर सकता है
acme update recipe से git pull को automate करें
# Update the Acme CLI
@update:
git fetch
git checkout main
documentation
- internal tool की सफलता के लिए adoption बहुत महत्वपूर्ण है, और नए users को tool install और explore करने में मदद देने वाला अच्छा user guide ज़रूरी है
README में installation और usage के निर्देश दें
# Acme CLI
## Prerequisites
`just`: Install just [here](https://github.com/casey/just/blob/master/README.md#installation)
## Installation
Clone this repo:
...
Set up the `acme` alias:
...
## Usage
List all available recipes:
...
- अब यह Acme Corp के सभी developers के उपयोग के लिए तैयार है!
- कंपनी के भीतर Slack message पोस्ट करके सभी को इसे आज़माने के लिए प्रोत्साहित किया जा सकता है, और हर व्यक्ति अपने snippets भी जोड़ सकता है
अतिरिक्त सुविधाएँ
- completion फीचर एक ऐसा mechanism है जिसमें TAB key दबाने पर subcommands, file paths, options आदि अपने-आप complete हो जाते हैं
- ज़्यादातर shells यह सुविधा देते हैं, और ज़्यादातर बड़े CLI tools completion install करने का तरीका भी देते हैं
- Python का Click, Golang का Cobra, Rust का clap जैसे ज़्यादातर प्रमुख CLI frameworks अपने-आप completion generate कर सकते हैं
Just, just --completion <shell>. चलाकर completion generate कर सकता है
1 टिप्पणियां
काफी समय से लगता है कि कंपनी के अंदरूनी DX की डिज़ाइन platform engineering के लिए एक महत्वपूर्ण विषय रही है।