tinyhash (پایتون)، @arvand/envguard (npm)، portcheck (Rust) و humanize (Zig) ابزارهای واقعیاند که روی رجیستریهای زرین منتشر شدهاند و هر کدام با یک دستور نصب میشوند؛ هر کدام چطور ساخته، آزموده و منتشر شد، برای الگوبرداری.
چهار ابزار کوچک، برای هر اکوسیستم یکی، که روی زرین همانطور منتشر شدهاند که شما بستهٔ خودتان را منتشر میکنید. کدشان در مخزنهای زرین زیر [arvand](/arvand) است، و هر کدام با یک دستور و با همان ابزاری که دارید، از هر جایی نصب میشود: ابزار نصب هر فایل را با هش آن میسنجد.
```diagram
type: cards
title: چهار بسته، چهار اکوسیستم
---
🐍 | بستهٔ tinyhash · پایتون | اثرانگشتهای کوتاه و پایدار برای فایلها و پوشهها: چیزی عوض شده؟ این همان فایل درست است؟
📦 | بستهٔ @arvand/envguard · npm | فایل .env شما در برابر .env.example: کلیدهای جاافتاده، مقدارهای خالی، رازهایی که به نمونه نشت کردهاند
🦀 | بستهٔ portcheck · Rust | این پورت آزاد است؟ آن یکی در دسترس است؟ و صبر تا در دسترس شود
⚡ | بستهٔ humanize · Zig | بایتها، مدتها، شمارشها و «چند وقت پیش» به شکلی که آدمها میخوانند، بدون allocator
```
## امتحانشان کنید
```bash
# tinyhash (Python)
pip install --index-url https://api.zaryn.xyz/v1/packages/pypi/all/simple/ tinyhash
tinyhash --tree data/
# @arvand/envguard (npm)
npx --@arvand:registry=https://api.zaryn.xyz/v1/packages/npm/ @arvand/envguard
npx @arvand/envguard --ci
# portcheck (Rust)
cargo install --index sparse+https://api.zaryn.xyz/v1/packages/cargo/index/ portcheck
portcheck --wait db:5432
# humanize (Zig)
zig fetch --save https://api.zaryn.xyz/v1/packages/zig/humanize/humanize-0.1.0.tar.gz
```
صفحهٔ هر بسته: [tinyhash](/packages/pypi/tinyhash) · [envguard](/packages/npm/@arvand/envguard) · [portcheck](/packages/cargo/portcheck) · [humanize](/packages/zig/humanize)
همین دستورها در [صفحهٔ بستهها](/packages#made-on-zaryn) با دکمهٔ کپی هم هستند.
```diagram
type: flow
title: راهی که هر کدام رفت
---
کد | یک مخزن زرین: zev init، zev commit، zev push | accent | 📁
~ آزمونها میگذرند
ساخت | دستورهای python -m build، npm pack، cargo package، یک tarball برای zig | | 🔨
~ یک توکن فقط برای انتشار
انتشار | دستورهای twine upload، npm publish، cargo publish، بارگذاری بایگانی zig، به رجیستری زرین | good | 🚀
~ هر کسی، از هر جایی
نصب | ابزارهای pip، npx، cargo، zig fetch: هر فایل با هشش سنجیده میشود | good | ✅
```
## بستهٔ tinyhash (پایتون)
اثرانگشتهای کوتاه BLAKE2b، در base32، برای فایلها و پوشهها.
```console
$ pip install --index-url https://api.zaryn.xyz/v1/packages/pypi/all/simple/ tinyhash
$ tinyhash --tree src/
uwulb2m4sffp tinyhash/__init__.py
zmciwvuja5wy tinyhash/cli.py
xubdz6t3q7rt src/ (4 files)
$ tinyhash --check kxppivxcxam2 data/
✓ data/ matches kxppivxcxam2
$ tinyhash --diff old/ new/
+ extra.txt
- notes.md
~ core.py
1 added, 1 removed, 1 changed
```
نمایهٔ بالا نمایهٔ یکتای زرین است: پروژههای زرین، و بقیه از pypi.org، پس وابستگیهای دیگر هم مثل همیشه نصب میشوند. `uv tool install --index … tinyhash` هم کار میکند.
چطور ساخته شد: فقط کتابخانهٔ استاندارد، پایتون ۳٫۹ به بعد، ۱۶ آزمون pytest، ساخته با `python -m build` و منتشر با `twine upload` و یک توکن فقط برای انتشار. همهٔ گامها: [نخستین بستهٔ پایتون خود را در ۵ دقیقه منتشر کنید](/docs/fa/publish-python-package).
## بستهٔ @arvand/envguard (npm)
```bash
npx --@arvand:registry=https://api.zaryn.xyz/v1/packages/npm/ @arvand/envguard
```
برای یک پروژه، یک بار در `.npmrc` به npm بگویید `@arvand` از کجا میآید:
```ini
@arvand:registry=https://api.zaryn.xyz/v1/packages/npm/
```
```bash
npm install --save-dev @arvand/envguard
```
| دستور | چه میکند |
|---|---|
| `envguard` | مقایسهٔ `.env` با `.env.example` |
| `envguard init` | نوشتن `.env.example` از `.env` شما، فقط کلیدها، امن برای کامیت |
| `envguard --ci` | بررسی محیط واقعی (رازهای CI) به جای یک فایل |
| `envguard --strict` | شکست برای مقدارهای خالی و کلیدهایی که در نمونه نیستند هم |
| `envguard --json` | نتیجه به شکل JSON |
نام دامنهدار (`@arvand/…`) را فقط صاحبش میتواند منتشر کند، پس کسی نمیتواند بستهای همنام را جلویش بگذارد. چطور ساخته شد: بی وابستگی، ماژولهای ES، Node 18 به بعد، ۱۷ آزمون `node:test`، `npm publish` به زرین. همهٔ گامها: [npm روی زرین](/docs/fa/packages-npm).
## بستهٔ portcheck (Rust)
```bash
cargo install --index sparse+https://api.zaryn.xyz/v1/packages/cargo/index/ portcheck
```
| دستور | چه میکند |
|---|---|
| `portcheck 8080` | پورت 8080 روی این رایانه آزاد است؟ |
| `portcheck host:port` | این رایانه به آن میرسد، و با چه سرعتی؟ |
| `portcheck https://example.com` | نشانیها هم کار میکنند: پورت از طرح نشانی میآید |
| `portcheck --free 3000-3100` | نخستین پورت آزاد در یک بازه |
| `portcheck --wait db:5432` | صبر تا جواب دهد (`--timeout 2m`) |
```bash
PORT=$(portcheck --free 3000-3100) npm run dev
portcheck --wait --timeout 2m postgres://db:5432 && ./migrate
```
چطور ساخته شد: فقط کتابخانهٔ استاندارد، ۹ آزمون، بی هشدار در `cargo clippy`، `cargo publish --registry zaryn`. برای یک پروژه، یک بار زرین را به `~/.cargo/config.toml` بیفزایید و `--registry zaryn` را به کار ببرید: [crateهای Rust روی زرین](/docs/fa/packages-rust).
## بستهٔ humanize (Zig)
```bash
zig fetch --save https://api.zaryn.xyz/v1/packages/zig/humanize/humanize-0.1.0.tar.gz
```
```zig
// build.zig
const humanize = b.dependency("humanize", .{});
exe.root_module.addImport("humanize", humanize.module("humanize"));
```
```zig
var buf: [32]u8 = undefined;
const size = try humanize.bytes(&buf, 1_572_864, .{}); // "1.5 MiB"
const took = try humanize.duration(&buf, 9045, .{}); // "2h 30m"
```
| تابع | چه میدهد |
|---|---|
| `bytes`، `parseBytes` | `1.5 MiB`، و برگرداندن `"10MB"` به بایت |
| `duration`، `elapsed`، `parseDuration` | `2h 30m`، `1.3 µs`، و برگرداندن `"1h30m"` به نانوثانیه |
| `count`، `compact` | `1,234,567`، `3.4M` |
| `ago`، `ordinal`، `plural` | `3 minutes ago`، `21st`، `file`/`files` |
چطور ساخته شد: بی allocator (در بافر شما مینویسد)، آزموده روی Zig 0.15 و 0.17، منتشر به شکل بایگانیای که `zig fetch` هشش را میسنجد. همهٔ گامها: [بستههای Zig روی زرین](/docs/fa/packages-zig).
## بستهٔ خودتان را بسازید
```diagram
type: cards
title: انتشار بستهٔ خودتان، برای هر اکوسیستم
---
🐍 | پایتون | دستورهای python -m build و twine upload به زرین: نخستین بستهٔ پایتون خود را منتشر کنید
📦 | بستهٔ npm | دستور npm publish با نامی دامنهدار که مال شماست: npm روی زرین
🦀 | زبان Rust | دستور cargo publish --registry zaryn: crateهای Rust روی زرین
⚡ | زبان Zig | یک tarball که zig fetch آن را میسنجد: بستههای Zig روی زرین
```
یک توکن انتشار در [صفحهٔ بستهها](/packages) بسازید (فقط میتواند منتشر کند). نامها مال کسی است که زودتر بیاید. بستههای عمومی در همهٔ طرحها رایگاناند.
چهار ابزار کوچک، برای هر اکوسیستم یکی، که روی زرین همانطور منتشر شدهاند که شما بستهٔ خودتان را منتشر میکنید. کدشان در مخزنهای زرین زیر arvand است، و هر کدام با یک دستور و با همان ابزاری که دارید، از هر جایی نصب میشود: ابزار نصب هر فایل را با هش آن میسنجد.
چهار بسته، چهار اکوسیستم
🐍
بستهٔ tinyhash · پایتون
اثرانگشتهای کوتاه و پایدار برای فایلها و پوشهها: چیزی عوض شده؟ این همان فایل درست است؟
📦
بستهٔ @arvand/envguard · npm
فایل .env شما در برابر .env.example: کلیدهای جاافتاده، مقدارهای خالی، رازهایی که به نمونه نشت کردهاند
🦀
بستهٔ portcheck · Rust
این پورت آزاد است؟ آن یکی در دسترس است؟ و صبر تا در دسترس شود
⚡
بستهٔ humanize · Zig
بایتها، مدتها، شمارشها و «چند وقت پیش» به شکلی که آدمها میخوانند، بدون allocator
نمایهٔ بالا نمایهٔ یکتای زرین است: پروژههای زرین، و بقیه از pypi.org، پس وابستگیهای دیگر هم مثل همیشه نصب میشوند. uv tool install --index … tinyhash هم کار میکند.
چطور ساخته شد: فقط کتابخانهٔ استاندارد، پایتون ۳٫۹ به بعد، ۱۶ آزمون pytest، ساخته با python -m build و منتشر با twine upload و یک توکن فقط برای انتشار. همهٔ گامها: نخستین بستهٔ پایتون خود را در ۵ دقیقه منتشر کنید.
نوشتن .env.example از .env شما، فقط کلیدها، امن برای کامیت
envguard --ci
بررسی محیط واقعی (رازهای CI) به جای یک فایل
envguard --strict
شکست برای مقدارهای خالی و کلیدهایی که در نمونه نیستند هم
envguard --json
نتیجه به شکل JSON
نام دامنهدار (@arvand/…) را فقط صاحبش میتواند منتشر کند، پس کسی نمیتواند بستهای همنام را جلویش بگذارد. چطور ساخته شد: بی وابستگی، ماژولهای ES، Node 18 به بعد، ۱۷ آزمون node:test، npm publish به زرین. همهٔ گامها: npm روی زرین.
چطور ساخته شد: فقط کتابخانهٔ استاندارد، ۹ آزمون، بی هشدار در cargo clippy، cargo publish --registry zaryn. برای یک پروژه، یک بار زرین را به ~/.cargo/config.toml بیفزایید و --registry zaryn را به کار ببرید: crateهای Rust روی زرین.
چطور ساخته شد: بی allocator (در بافر شما مینویسد)، آزموده روی Zig 0.15 و 0.17، منتشر به شکل بایگانیای که zig fetch هشش را میسنجد. همهٔ گامها: بستههای Zig روی زرین.