YAP — Yet Another Packager について
YAP は共通の PKGBUILD 仕様から複数の GNU/Linux ディストリビューション向けネイティブパッケージをビルドします。分離された複数形式のビルドを必要とするパッケージメンテナー向けで、クロスコンパイル、署名、SBOM 生成にも対応します。
主な機能
- 01DEB、RPM、APK、TAR.ZST のビルド
- 02Docker または Podman による分離ビルド
- 03別アーキテクチャ向けクロスコンパイル
- 04パッケージ署名と SBOM 生成
- 05依存関係の解決とビルド順序管理
- 06OpenArtifact への成果物公開
活用シーン
- 01複数ディストリビューション向けのビルド
- 02別アーキテクチャ向け成果物の作成
- 03リリースへの署名と SBOM 添付
MCP 対応
付属の yap-mcp バイナリは、YAP のビルドパイプラインを MCP 対応クライアントに公開します。リリースバイナリまたはスタンドアロン OCI イメージで実行できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
docker run -i --rm -e YAP_VERBOSE ghcr.io/m0rf30/yap-mcp:2.8.0YAP_VERBOSESet to 1 for debug-level JSON-RPC frame logging on stderr.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ghcr.io/m0rf30/yap-mcp:2.8.0stdioツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
YAP は、単一の PKGBUILD 仕様から複数の GNU/Linux ディストリビューション向けのネイティブパッケージをビルドします。パッケージを一度作成すれば、.deb、.rpm、.apk、.pkg.tar.zst を生成できます。すべてのビルドは、分離された OCI コンテナー(Docker または Podman)内で実行されます。
特長
- 複数形式での出力:DEB(Debian/Ubuntu)、RPM(Fedora/RHEL/Rocky/openSUSE)、APK(Alpine)、TAR.ZST(Arch)
- コンテナーによる分離:再現可能なビルド、ホスト環境への影響なし、Docker と Podman に対応
- PKGBUILD ベース:使い慣れた Arch Linux の構文を、ディストリビューションとアーキテクチャのオーバーライドに対応するよう拡張
- クロスコンパイル:ホストとは異なるアーキテクチャ向けにビルド
- 依存関係を考慮したビルド:デフォルトでは順次実行、
--parallelを指定するとオプトインで並列トポロジカルソート - パッケージ署名:APK RSA + DEB/RPM/Pacman GPG(
gpgバイナリは不要) - SBOM 生成:CycloneDX 1.5 と SPDX 2.3 のサイドカーファイル
- 公開:
yap publishにより、DEB/RPM(および APK/Pacman は未加工ファイルとして)を OpenArtifact リポジトリにアップロード - 形式ごとの圧縮:DEB と RPM で
zstd/gzip/xzに対応 - 変更履歴に対応:PKGBUILD の
changelogフィールドを、ディストリビューションごとのネイティブ形式に変換 - Pacman スクリプトレット:6 つのフックによるライフサイクル全体に対応(インストール前/後、アップグレード前/後、削除前/後)
- 構造化ログ:slog ベース、長い行はツリー形式で表示、外部 UI 依存関係なし
インストール
ワンライナー(Linux/macOS、amd64/arm64):
curl -fsSL https://raw.githubusercontent.com/M0Rf30/yap/main/scripts/install.sh | sh
バージョンを固定するか、ツールを 1 つだけインストールする場合:
curl -fsSL https://raw.githubusercontent.com/M0Rf30/yap/main/scripts/install.sh \
| sh -s -- --version v2.1.3 --tool yap
手動ダウンロード:
wget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz
tar -xzf yap_Linux_x86_64.tar.gz
sudo mv yap /usr/local/bin/
yap version
ソースからビルド
git clone https://github.com/M0Rf30/yap.git
cd yap
make build
sudo mv yap /usr/local/bin/
Docker または Podman が必要です:
# Docker
sudo systemctl enable --now docker && sudo usermod -aG docker $USER
# Podman
sudo systemctl enable --now podman
クイックスタート
1. プロジェクト構成
yap.json を作成します:
{
"name": "My Package",
"description": "A sample package built with YAP",
"buildDir": "/tmp/yap-build",
"output": "artifacts",
"projects": [
{ "name": "my-package" }
]
}
2. PKGBUILD
my-package/PKGBUILD を作成します:
pkgname=my-package
pkgver=1.0.0
pkgrel=1
pkgdesc="My awesome application"
arch=('x86_64')
license=('GPL-3.0')
url="https://github.com/user/my-package"
makedepends=('gcc' 'make')
source=("https://github.com/user/my-package/archive/v${pkgver}.tar.gz")
sha256sums=('SKIP')
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
make
}
package() {
cd "${srcdir}/${pkgname}-${pkgver}"
install -Dm755 my-package "${pkgdir}/usr/bin/my-package"
install -Dm644 README.md "${pkgdir}/usr/share/doc/${pkgname}/README.md"
}
3. ビルド
# Auto-detect host distro from /etc/os-release
yap build .
# Specific distribution
yap build ubuntu-jammy .
yap build fedora-38 /path/to/project
yap build --cleanbuild --no-makedeps ubuntu-jammy .
4. 出力
artifacts/
├── my-package_1.0.0-1_amd64.deb
├── my-package-1.0.0-1.x86_64.rpm
├── my-package-1.0.0-r1.apk
└── my-package-1.0.0-1-x86_64.pkg.tar.zst
プロジェクト設定(yap.json)
{
"name": "My Multi-Package Project",
"description": "Project description",
"buildDir": "/tmp/yap-builds",
"output": "dist",
"projects": [
{ "name": "package-one", "install": true },
{ "name": "package-two" }
]
}
| フィールド | 必須 | デフォルト | 説明 |
|---|---|---|---|
name | はい | — | プロジェクトコレクション名 |
description | はい | — | プロジェクトコレクションの説明 |
buildDir | はい | — | ビルド/作業ディレクトリ |
output | はい | — | ビルド済みパッケージの出力ディレクトリ |
projects | はい | — | ビルドするパッケージの順序付き配列 |
projects[].name | はい | — | パッケージの PKGBUILD を含むサブディレクトリ |
projects[].install | いいえ | false | 後続のパッケージが依存できるよう、ビルド直後にインストールする |
compressionDeb / compressionRpm | いいえ | zstd | 形式ごとの圧縮:zstd/gzip/xz |
signing | いいえ | — | 署名設定(パッケージ署名を参照) |
repos | いいえ | — | 依存関係を解決する前に設定する追加のパッケージリポジトリ |
skipDeps | いいえ | — | makedepends から除外するパッケージ名 |
targetArch | いいえ | ホスト | クロスコンパイルのターゲットアーキテクチャ |
parallel | いいえ | false | 独立したパッケージを並列でビルド(トポロジカルソート) |
sbom | いいえ | false | SBOM サイドカーファイルを生成 |
sbomFormat | いいえ | both | cyclonedx/spdx/both |
publish | いいえ | — | yap publish のデフォルト設定(OpenArtifact への公開を参照)。トークンは保持しません |
パッケージ間のビルド順序は、install フラグと各 PKGBUILD の
depends/makedepends によって決まります。yap.json レベルの depends
フィールドはありません。完全な仕様については、yap.schema.json を参照してください。
エディターでの検証(JSON Schema)
yap.json 用の JSON Schema がリポジトリのルートに含まれています:yap.schema.json。
圧縮、署名、リポジトリ、SBOM、クロスコンパイルなど、サポートされているすべてのフィールドを記述しています。JSON Schema に対応したエディターで自動補完とインライン検証を行うには、yap.json からこのスキーマを参照してください。
{
"$schema": "https://www.schemastore.org/yap.json",
"name": "My Multi-Package Project",
"...": "..."
}
このスキーマは SchemaStore で公開されているため、エディター(VS Code、JetBrains、Neovim など)ではファイル名に基づいて任意の yap.json が自動的に検証されます。$schema 行は不要です。
PKGBUILD 拡張機能
ディストリビューション固有の変数
__(アンダースコア 2 つ)を使うと、ディストリビューションごとに任意の変数を上書きできます。優先順位は次のとおりです(数値が大きいほど優先されます)。
| 優先順位 | 構文 | 例 |
|---|---|---|
| 4+ | アーキテクチャ + ディストリビューション | depends_x86_64__ubuntu_noble |
| 4 | アーキテクチャのみ | depends_x86_64 |
| 3 | ディストリビューション + コードネーム | depends__ubuntu_noble |
| 2 | ディストリビューション | depends__ubuntu |
| 1 | パッケージマネージャー | depends__apt |
| 0 | 基本(フォールバック) | depends |
pkgdesc="My application"
pkgdesc__debian="My application for Debian/Ubuntu"
pkgdesc__ubuntu_noble="My application optimized for Ubuntu 24.04"
makedepends=('gcc' 'make')
makedepends__apt=('build-essential' 'cmake')
makedepends__yum=('gcc-c++' 'cmake3')
makedepends__ubuntu_noble=('build-essential' 'cmake' 'pkg-config' 'libtool')
アーキテクチャ固有の変数
depends=('glibc' 'gcc')
depends_x86_64=('glibc' 'gcc' 'lib32-glibc')
depends_aarch64=('glibc' 'gcc' 'aarch64-linux-gnu-gcc')
source=('https://example.com/generic-source.tar.gz')
source_x86_64=('https://example.com/x86_64-optimized.tar.gz')
source_aarch64=('https://example.com/aarch64-source.tar.gz')
sha256sums=('generic_hash')
sha256sums_x86_64=('x86_64_specific_hash')
sha256sums_aarch64=('aarch64_specific_hash')
サポートされているアーキテクチャ:x86_64、i686、aarch64、armv7h、armv6h、armv5、ppc64、ppc64le、s390x、mips、mipsle、riscv64、pentium4、any。
チェックサムの種類
サポートされている種類(強度の高い順、処理の速い順):b2sums、sha512sums、sha384sums、sha256sums、sha224sums、cksums。
# BLAKE2b (recommended)
b2sums=('2f240f2a3d2f8d8f...')
# CRC32 (format: checksum filesize)
cksums=('1234567890 2048576')
変更履歴
changelog=CHANGELOG.md
- DEB:
usr/share/doc/<pkgname>/changelog.Debian.gz(Lintian 準拠) - RPM:パッケージメタデータにネイティブの
%changelogエントリーを埋め込み - Pacman:アーカイブ内の
.CHANGELOG - APK:無視(Alpine の慣例がないため)
Pacman スクリプトレット
pre_install() { echo "Before install"; }
post_install() { systemctl daemon-reload; }
pre_upgrade() { systemctl stop myservice; }
post_upgrade() { systemctl start myservice; }
pre_remove() { systemctl disable myservice; }
post_remove() { systemctl daemon-reload; }
少なくとも 1 つのフックが定義されている場合にのみ、<pkgname>.install に出力されます。pre/post_upgrade がない場合は、pre/post_install にフォールバックします。
パッケージマネージャー固有のフィールド
# DEB
section=utils
priority=optional
# RPM
group="Applications/System"
requires_pre=('shadow-utils')
# APK
maintainer="John Doe <[email protected]>"
サポートされているディストリビューション
| ディストリビューション ID | 形式 | パッケージマネージャー |
|---|---|---|
almalinux | .rpm | yum |
alpine | .apk | apk |
amzn | .rpm | yum |
arch | .pkg.tar.zst | pacman |
centos | .rpm | yum |
debian | .deb | apt |
fedora | .rpm | yum |
linuxmint | .deb | apt |
opensuse-leap | .rpm | zypper |
opensuse-tumbleweed | .rpm | zypper |
ol | .rpm | yum |
pop | .deb | apt |
rhel | .rpm | yum |
rocky | .rpm | yum |
ubuntu | .deb | apt |
Model Context Protocol(MCP)
YAP には、同じビルドパイプラインを Model Context Protocol 経由で公開するコンパニオンバイナリ yap-mcp が含まれています。そのため、MCP 対応の LLM クライアント(Claude Desktop、opencode、Cursor、Zed、Continue、Goose など)から yap を直接操作できます。
リリースバイナリを使ったクイックスタート:
curl -fsSL https://raw.githubusercontent.com/M0Rf30/yap/main/scripts/install.sh | sh
# then add { "mcpServers": { "yap": { "command": "yap-mcp" } } } to your client config
または、スタンドアロン OCI イメージを取得してください(MCP レジストリにも io.github.M0Rf30/yap として掲載されています)。
docker pull ghcr.io/m0rf30/yap-mcp:latest
# client config:
# { "mcpServers": { "yap": { "command": "docker",
# "args": ["run","-i","--rm","ghcr.io/m0rf30/yap-mcp:latest"] } } }
Claude Code プラグイン(サーバーとスキルを一体化)
/plugin marketplace add M0Rf30/claude-plugins
/plugin install yap@M0Rf30
Smithery
npx @smithery/cli install io.github.M0Rf30/yap --client claude
すべてのツール、クライアントごとの設定例、セキュリティモデル、トラブルシューティングについては、MCP.md をご覧ください。同梱のスキルカード skills/yap/SKILL.md は Anthropic Agent Skills のレイアウトに準拠しており、エージェント向けのワークフロー早見表を無料で提供します。配布チャンネルとリリース手順については、PUBLISHING.md に記載されています。
CLI リファレンス
コマンド
yap build [distro[-release]] <path> # Build packages (distro auto-detected if omitted)
yap zap [distro] <path> # Clean build environment
yap prepare [distro[-release]] # Prepare host build environment
yap pull <distro> # Pull pre-built container images
yap install <artifact-file> # Install a built artifact
yap publish [artifact-or-dir]... # Upload built packages to an OpenArtifact repository
yap graph [path] # Show dependency graph
yap list-distros # List supported distributions
yap status # Show host status and runtime detection
yap version # Show version information
yap completion <shell> # Generate shell completion (bash/zsh/fish/powershell)
ビルドフラグ
# Build behavior
--cleanbuild, -c # Clean srcdir before build
--no-build, -o # Download sources only
--zap, -z # Deep clean staging directory
--skip-hash-check, -H # Skip source checksum verification
--no-container # Build natively on the host (skip container dispatch)
# Dependencies
--no-makedeps, -d # Skip makedeps installation
--skip-sync, -s # Skip package manager sync
--skip-deps pkg1,pkg2 # Omit specific packages from makedeps
--parallel, -P # Enable parallel topo-sort (opt-in)
# Version
--pkgver 1.2.3, -w # Override package version
--pkgrel 2, -r # Override release number
# Range / filter
--from package1 # Start from specific package
--to package5 # Stop at specific package
--only pkg1,pkg2 # Build only listed packages
--skip pkg1,pkg2 # Skip listed packages
# Source access
--ssh-password pass, -p # Password for SSH source access
--source-retries <n> # Retries after first attempt for source/gensum/toolchain downloads (default 3; env: YAP_SOURCE_MAX_RETRIES)
# Cross-compilation
--target-arch arm64, -t # Cross-compile for target architecture
--skip-toolchain-validation, -T
# Repositories / trust
--repo "<spec>" # Add an extra package repository (repeatable)
--allow-unverified-repos, -U # Allow apt sources without a verifiable Signed-By key
# Signing
--sign, -K # Enable artifact signing
--sign-key /path/to/key # Private key path
--sign-passphrase pass # Passphrase (prefer env: YAP_SIGN_PASSPHRASE)
--sign-key-name mykey # APK key name
# SBOM
--sbom, -S # Generate SBOM sidecars
--sbom-format cyclonedx # CycloneDX 1.5 only
--sbom-format spdx # SPDX 2.3 only
--sbom-format both # Both (default)
# Compression
--compression-deb gzip # DEB: zstd|gzip|xz (default: zstd)
--compression-rpm xz # RPM: zstd|gzip|xz (default: zstd)
# Debug / output
--debug-dir /path, -D # Emit split debug info
--verbose # Verbose logging
--no-color # Disable colored output
シェル補完
yap completion bash > /etc/bash_completion.d/yap
yap completion zsh > /usr/share/zsh/site-functions/_yap
yap completion fish > ~/.config/fish/completions/yap.fish
yap completion powershell > yap.ps1
パッケージ署名
| 形式 | アルゴリズム | 出力 |
|---|---|---|
| APK | RSA PKCS#1 v1.5 SHA1 | 埋め込みストリーム .SIGN.RSA.<keyname>.rsa.pub |
| DEB | OpenPGP | <package>.deb.asc(ASCII アーマー形式の分離署名) |
| RPM | OpenPGP | <package>.rpm.asc + rpmpack による RPM 内への任意の署名 |
| Pacman | OpenPGP | <package>.pkg.tar.zst.sig(バイナリ形式の分離署名) |
署名には github.com/ProtonMail/go-crypto/openpgp を使用するため、gpg バイナリは不要です。
キーの解決順序(優先度の高い順)
--sign-key <path>CLI フラグ- 形式別環境変数:
YAP_APK_KEY、YAP_DEB_KEY、YAP_RPM_KEY、YAP_PACMAN_KEY - グローバル環境変数:
YAP_SIGN_KEY yap.jsonのフィールドsigning.keyPath~/.config/yap/keys/<format>.{rsa,gpg}、次に~/.config/yap/keys/default.{rsa,gpg}
パスフレーズの解決順序も、_PASSPHRASE サフィックスを付けて、キーの解決順序に準じます。
yap.json の署名設定
{
"signing": {
"enabled": true,
"keyPath": "~/.config/yap/keys/release.gpg",
"keyName": "release"
}
}
署名済みパッケージの検証
# APK (after distributing the public key to /etc/apk/keys/)
apk add my-package.apk
# DEB
gpg --verify my-package_1.0.0_amd64.deb.asc my-package_1.0.0_amd64.deb
# RPM
rpm -K my-package-1.0.0-1.x86_64.rpm
# Pacman
pacman-key --verify my-package-1.0.0-1-x86_64.pkg.tar.zst.sig
OpenArtifact への公開
yap publish は、ホスト型の
OpenArtifact リポジトリにビルド済みパッケージをアップロードします。このリポジトリは apt/dnf インデックス(Release、Packages、repomd.xml)を自ら提供します。
| 形式 | 使用するルート | 備考 |
|---|---|---|
| DEB | POST {url}/api/v1/repositories/{deb-repo}/debs | file、distribution、component のマルチパート |
| RPM | POST {url}/api/v1/repositories/{rpm-repo}/packages | file のマルチパート |
| APK | PUT {url}/repos/raw/{apk-repo}/{apk-path}/{file} | ホスト型の raw リポジトリです。OpenArtifact はまだ apk インデックスに対応していません |
| Pacman | PUT {url}/repos/raw/{pacman-repo}/{pacman-path}/{file} | raw リポジトリです。パッケージと同じ場所にある .sig/.asc サイドカーファイルもアップロードされます |
export YAP_OA_URL=https://oa.example.com
export YAP_OA_TOKEN_FILE=~/.config/yap/oa-token # or YAP_OA_TOKEN
export YAP_OA_DEB_REPO=debs YAP_OA_RPM_REPO=rpms
yap build ubuntu-jammy .
yap publish --distribution jammy --component main ./dist # or a single file
yap publish --dry-run ./dist # list only, no network
設定は次の順に解決されます(後の設定が優先されます):yap.json の publish オブジェクト、YAP_OA_* 環境変数、コマンドラインフラグ。
{
"output": "dist",
"publish": {
"url": "https://oa.example.com",
"debRepo": "debs",
"rpmRepo": "rpms",
"distribution": "jammy",
"component": "main"
}
}
| 設定 | yap.json | 環境変数 | フラグ |
|---|---|---|---|
| サーバー URL | url | YAP_OA_URL | --url |
| API トークン | — | YAP_OA_TOKEN、YAP_OA_TOKEN_FILE | --token-file |
| DEB リポジトリ | debRepo | YAP_OA_DEB_REPO | --deb-repo |
| RPM リポジトリ | rpmRepo | YAP_OA_RPM_REPO | --rpm-repo |
| APK raw リポジトリ/パス | apkRepo / apkPath | YAP_OA_APK_REPO / YAP_OA_APK_PATH | --apk-repo / --apk-path |
| Pacman raw リポジトリ/パス | pacmanRepo / pacmanPath | YAP_OA_PACMAN_REPO / YAP_OA_PACMAN_PATH | --pacman-repo / --pacman-path |
| apt ディストリビューション/コンポーネント | distribution / component | YAP_OA_DISTRIBUTION / YAP_OA_COMPONENT | --distribution / --component |
その他のフラグ:--config <yap.json|dir>(デフォルトは ./yap.json)、--retries <n>
(リクエストごとの試行回数。デフォルトは 3)、--timeout <duration>(リクエストごとのタイムアウト。デフォルトは
30m)、--insecure-http、--dry-run。
動作:
- トークン:対象リポジトリへの書き込み権限を持つ OpenArtifact API トークン(
deployトークンのoa_dep_…で十分です)。Authorization: Bearer …として送信され、yap.jsonやフラグの値からは受け付けられません(そのため、プロセス一覧に表示されません)。ログやエラーではマスキングされます。トークンはhttps経由、または--insecure-httpを指定しない場合はループバックホストへのhttp経由でのみ送信されます。 - 引数:パッケージファイルおよび/またはディレクトリです。引数を指定しない場合は、
yap.jsonのoutputディレクトリが公開されます。ディレクトリのスキャン中に見つかったパッケージの形式に対応するリポジトリが設定されていない場合、そのパッケージは警告を出してスキップされます。この状況でファイルを明示的に指定した場合はエラーになります。 - 検証:サーバーから返される SHA-256(raw ファイルの場合は
X-Checksum-Sha256)がローカルファイルの値と一致しない場合、公開は失敗します。 - 再試行:接続エラーおよび HTTP 408/429/5xx は、指数バックオフとジッターを使って再試行されます。それ以外の 4xx 応答(不正なトークン、誤ったリポジトリ、無効なパッケージ)は直ちに失敗します。
- 冪等性:DEB/RPM パッケージはサーバー上で不変であり、サーバーは
409を返します。その後 yap はリポジトリ一覧で SHA-256 を確認します。同一のバイト列は成功(「変更なし」)と見なされます。同じ名前とバージョンで異なるバイト列の場合は失敗します。raw ファイルはX-Checksum-Sha256がすでに一致していればスキップされ、一致しない場合は置き換えられます(リポジトリが不変のリリースを強制している場合は公開に失敗します)。 - 署名:OpenArtifact はリポジトリの インデックス に署名します。DEB/RPM では、yap のパッケージごとの
.ascファイルはアップロードされません。APK/Pacman の raw リポジトリでは、.sig/.ascサイドカーファイルがパッケージと同じ場所にアップロードされます。
いずれかのパッケージで失敗した場合、終了ステータスは 0 以外になります。残りのパッケージの処理は引き続き試みられます。
SBOM の生成
yap build --sbom . # Both formats (default)
yap build --sbom --sbom-format cyclonedx .
yap build --sbom --sbom-format spdx .
各アーティファクトと同じ場所に出力:
artifacts/
└── my-package_1.0.0-1_amd64.deb
my-package_1.0.0-1_amd64.deb.cdx.json ← CycloneDX 1.5
my-package_1.0.0-1_amd64.deb.spdx.json ← SPDX 2.3
取得される情報:名前、バージョン、ライセンス、ランタイム/ビルド依存関係、ソース URL とチェックサム、ファイルハッシュ、DESCRIBES/DEPENDS_ON 関係。
高度な使い方
クロスコンパイル
yap build --target-arch=aarch64 ubuntu-jammy .
yap build --target-arch=armv7 fedora-38 .
yap build --target-arch=i686 alpine .
yap build --target-arch=ppc64le arch .
YAP は必要なクロスコンパイルツールチェーンをインストールし、ビルド環境を自動的に設定します。
マルチパッケージプロジェクト
{
"name": "My Suite",
"projects": [
{ "name": "core-library", "install": true },
{ "name": "main-application", "install": true },
{ "name": "plugins", "install": false }
]
}
"install": true が指定されたパッケージはビルド直後にインストールされるため、後続のパッケージはビルド時の依存関係として利用できます。
# Sequential (default) — explicit ordering via "install" field
yap build .
# Parallel — topo-sort + worker pool
yap build --parallel .
ビルド環境の準備
yap prepare # Auto-detect host distro
yap prepare ubuntu-jammy
yap prepare fedora-38
yap prepare --golang arch
yap prepare --skip-sync rocky-9
CI/CD との統合
GitHub Actions
name: Build Packages
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install YAP
run: |
wget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz
tar -xzf yap_Linux_x86_64.tar.gz
sudo mv yap /usr/local/bin/
- name: Build Packages
run: yap build
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: packages
path: artifacts/
GitLab CI
build-packages:
stage: build
image: ubuntu:22.04
before_script:
- apt-get update && apt-get install -y wget docker.io
- wget https://github.com/M0Rf30/yap/releases/latest/download/yap_Linux_x86_64.tar.gz
- tar -xzf yap_Linux_x86_64.tar.gz && mv yap /usr/local/bin/
script:
- yap build
artifacts:
paths:
- artifacts/
expire_in: 1 week
例
examples ディレクトリには、すぐにビルドできる完全なプロジェクトが含まれています。
| 例 | 説明 |
|---|---|
| circular-deps | 循環依存の検出 — YAP は明確なエラーを表示して失敗します |
| dependency-orchestration | 依存関係の自動解決とビルド順序制御を行う 5 パッケージのプロジェクト |
| yap | YAP 自体のパッケージ化 — インストールスクリプト付きの Go アプリケーション |
| split-package | ディストリビューションごとのオーバーライドを使い、1 回のビルドで複数のインストール可能なパッケージを生成 |
| multi-architecture | アーキテクチャ固有のソース、依存関係、チェックサム |
PKGBUILD の例
シンプルな C アプリケーション
pkgname=hello-world
pkgver=1.0.0
pkgrel=1
pkgdesc="A simple Hello World program"
arch=('x86_64')
license=('MIT')
makedepends=('gcc')
source=("hello.c")
sha256sums=('SKIP')
build() { gcc -o hello hello.c; }
package() { install -Dm755 hello "${pkgdir}/usr/bin/hello"; }
Python アプリケーション
pkgname=python-myapp
pkgver=2.1.0
pkgrel=1
pkgdesc="My Python application"
arch=('any')
license=('Apache-2.0')
depends=('python3')
makedepends__apt=('python3-dev' 'python3-setuptools')
makedepends__yum=('python3-devel' 'python3-setuptools')
source=("https://pypi.io/packages/source/m/myapp/myapp-${pkgver}.tar.gz")
sha256sums=('...')
build() {
cd "${srcdir}/myapp-${pkgver}"
python3 setup.py build
}
package() {
cd "${srcdir}/myapp-${pkgver}"
python3 setup.py install --root="${pkgdir}" --optimize=1
}
systemd を使用する Web サービス
pkgname=web-service
pkgver=1.5.0
pkgrel=1
pkgdesc="My web service"
arch=('x86_64')
license=('GPL-3.0')
depends=('systemd')
backup=('etc/web-service/config.yml')
source=("web-service-${pkgver}.tar.gz" "web-service.service")
sha256sums=('...' 'SKIP')
build() {
cd "${srcdir}/web-service-${pkgver}"
make build
}
package() {
cd "${srcdir}/web-service-${pkgver}"
install -Dm755 web-service "${pkgdir}/usr/bin/web-service"
install -Dm644 ../web-service.service \
"${pkgdir}/usr/lib/systemd/system/web-service.service"
install -Dm644 config.yml "${pkgdir}/etc/web-service/config.yml"
install -dm755 "${pkgdir}/var/lib/web-service"
install -dm755 "${pkgdir}/var/log/web-service"
}
開発
Make ターゲット
make all # clean, deps, fmt, lint, test, doc, build
make build # build the yap binary
make build-all # build for linux/darwin/windows, amd64/arm64
make clean # clean build artifacts
make deps # download and tidy Go modules
make fmt # gofmt
make lint # golangci-lint
make lint-md # markdownlint
make test # run all tests (-p 1 -v, sequential required)
make test-coverage # tests with coverage report (coverage.html)
make release # create release packages
make doc # view all package documentation
make doc-serve # start pkgsite on localhost:8080
make doc-generate # generate static docs in docs/api/
make doc-package PKG=./pkg/builders/apk
make docker-build DISTRO=ubuntu
make docker-build-all
make docker-list-distros
make i18n-check # verify localization file integrity
make i18n-stats # localization statistics
テスト
テストは逐次実行する必要があります(-p 1)。
make test
go test ./pkg/source -v
go test ./pkg/builders/deb -v
go test ./pkg/graph -v
go test -race ./pkg/builders/...
go test -timeout 30s ./pkg/download/...
国際化
対応言語:英語(en)、イタリア語(it)。
言語は LANG/LC_ALL/LC_MESSAGES/LANGUAGE から自動検出されます。--language/-l で上書きできます。
yap --language=it build .
言語を追加するには、pkg/i18n/locales/en.yaml を pkg/i18n/locales/{code}.yaml にコピーして翻訳し、pkg/i18n/i18n.go の SupportedLanguages にコードを追加して、プルリクエストを送信してください。
トラブルシューティング
コンテナランタイム
systemctl status docker # or podman
docker run --rm hello-world # test access
sudo usermod -aG docker $USER # fix permissions (re-login required)
ビルドの失敗
yap build --verbose
yap zap ubuntu-jammy /path/to/project
yap status
権限の問題
sudo chown -R $USER:$USER artifacts/
setsebool -P container_manage_cgroup true # SELinux (Red Hat family)
パフォーマンス
yap build --skip-sync # skip package manager sync
yap build --cleanbuild # clean source before build
貢献
- リポジトリをフォークします
- 機能ブランチを作成します:
git checkout -b feature/my-feature - 変更を加えてテストを追加します
make fmt lint testを実行します- コミットしてプルリクエストを作成します
コミュニティのガイドラインについては、CODE_OF_CONDUCT.md を参照してください。
ライセンス
GNU General Public License v3.0。LICENSE.md を参照してください。
クレジット
- YAP の着想元となったプロジェクト Pacur への貢献について、Zachary Huff
- PKGBUILD 形式を提供する Arch Linux コミュニティ
- すべてのコントリビューター
Go、Cobra、Docker/Podman で構築されています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。