# ساخته‌شده روی زرین: چهار بسته برای امتحان

> tinyhash (پایتون)، @arvand/envguard (npm)، portcheck (Rust) و humanize (Zig) ابزارهای واقعی‌اند که روی رجیستری‌های زرین منتشر شده‌اند و هر کدام با یک دستور نصب می‌شوند؛ هر کدام چطور ساخته، آزموده و منتشر شد، برای الگوبرداری.

Source: https://zaryn.xyz/docs/fa/made-on-zaryn

چهار ابزار کوچک، برای هر اکوسیستم یکی، که روی زرین همان‌طور منتشر شده‌اند که شما بستهٔ خودتان را منتشر می‌کنید. کدشان در مخزن‌های زرین زیر [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) بسازید (فقط می‌تواند منتشر کند). نام‌ها مال کسی است که زودتر بیاید. بسته‌های عمومی در همهٔ طرح‌ها رایگان‌اند.
