Skip Navigation
Show nav
Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log inorSign up
View categories

Categories

  • Heroku のアーキテクチャ
    • Dyno (アプリコンテナ)
      • Dyno Management
      • Dyno Concepts
      • Dyno Behavior
      • Dyno Reference
      • Dyno Troubleshooting
    • スタック (オペレーティングシステムイメージ)
    • ネットワーキングと DNS
    • プラットフォームポリシー
    • プラットフォームの原則
  • Developer Tools
    • コマンドライン
    • Heroku VS Code Extension
  • デプロイ
    • Git を使用したデプロイ
    • Docker によるデプロイ
    • デプロイ統合
  • 継続的デリバリーとインテグレーション
    • 継続的統合
  • 言語サポート
    • Node.js
      • Working with Node.js
      • Node.js Behavior in Heroku
      • Troubleshooting Node.js Apps
    • Ruby
      • Rails のサポート
      • Bundler の使用
      • Working with Ruby
      • Ruby Behavior in Heroku
      • Troubleshooting Ruby Apps
    • Python
      • Working with Python
      • Python でのバックグランドジョブ
      • Python Behavior in Heroku
      • Django の使用
    • Java
      • Java Behavior in Heroku
      • Working with Java
      • Maven の使用
      • Spring Boot の使用
      • Troubleshooting Java Apps
    • PHP
      • PHP Behavior in Heroku
      • Working with PHP
    • Go
      • Go の依存関係管理
    • Scala
    • Clojure
    • .NET
      • Working with .NET
  • データベースとデータ管理
    • Heroku Postgres
      • Postgres の基礎
      • Postgres スターターガイド
      • Postgres のパフォーマンス
      • Postgres のデータ転送と保持
      • Postgres の可用性
      • Postgres の特別なトピック
      • Migrating to Heroku Postgres
    • Heroku Data For Redis
    • Apache Kafka on Heroku
    • その他のデータストア
  • AI
    • Working with AI
    • Heroku Inference
      • Inference API
      • Quick Start Guides
      • AI Models
      • Inference Essentials
    • Vector Database
    • Model Context Protocol
  • モニタリングとメトリクス
    • ログ記録
  • アプリのパフォーマンス
  • アドオン
    • すべてのアドオン
  • 共同作業
  • セキュリティ
    • アプリのセキュリティ
    • ID と認証
      • シングルサインオン (SSO)
    • Private Space
      • インフラストラクチャネットワーキング
    • コンプライアンス
  • Heroku Enterprise
    • Enterprise Accounts
    • Enterprise Team
    • Heroku Connect (Salesforce 同期)
      • Heroku Connect の管理
      • Heroku Connect のリファレンス
      • Heroku Connect のトラブルシューティング
  • パターンとベストプラクティス
  • Heroku の拡張
    • Platform API
    • アプリの Webhook
    • Heroku Labs
    • アドオンのビルド
      • アドオン開発のタスク
      • アドオン API
      • アドオンのガイドラインと要件
    • CLI プラグインのビルド
    • 開発ビルドパック
    • Dev Center
  • アカウントと請求
  • トラブルシューティングとサポート
  • Salesforce とのインテグレーション
  • Heroku の拡張
  • 開発ビルドパック
  • buildpack API

buildpack API

日本語 — Switch to English

この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。

最終更新日 2024年04月24日(水)

Table of Contents

  • buildpack API
  • .profile.d スクリプト
  • 複数の buildpack の構成
  • キャッシング
  • スタック
  • バイナリ
  • buildpack の公開と共有
  • buildpack の例

buildpack は、Heroku でのアプリのビルドを機能強化するためのスクリプトです。Heroku プラットフォームで buildpack が果たす役割の概要については、buildpack の記事​を確認してください。

buildpack API

将来の Heroku スタックとの互換性を確保するために、buildpack 開発者には sh​ または bash​ を使用することをお勧めします。

buildpack は、次の 3 つのスクリプトで構成されます。

  • bin/detect​: この buildpack がアプリに適用されるかどうかを判定します。
  • bin/compile​: アプリで変換手順を実行するために使用されます。
  • bin/release​: メタデータをランタイムに戻します。

bin/detect

使用法

bin/detect BUILD_DIR

stdout​ に送信された名前は、プッシュ中にアプリケーションタイプとして表示されます。

まとめ

このスクリプトは 1 つの引数として BUILD_DIR​ を受け取り、BUILD_DIR​ に存在するアプリをこの buildpack で処理できる場合は 0​ の終了コードを返す必要があります。終了コードが 0​ である場合、このスクリプトは、人間に解読可能なフレームワーク名を stdout​ に出力する必要があります。

例

#!/bin/sh

# this pack is valid for apps with a hello.txt in the root
if [ -f $1/hello.txt ]; then
  echo "HelloFramework"
  exit 0
else
  exit 1
fi

bin/compile

使用法

bin/compile BUILD_DIR CACHE_DIR ENV_DIR

まとめ

CACHE_DIR​ の内容はビルド前後で永続化されます。将来のビルドを高速化するために、依存関係解決などの長いプロセスの結果をここにキャッシュできます。

このスクリプトは、buildpack の変換を実行します。BUILD_DIR​はアプリの場所になり、CACHE_DIR​ は buildpack がビルド間でビルド成果物をキャッシュするために使用できる場所になります。

このスクリプトから stdout​ で受信されたすべての出力が (対話型 Git プッシュビルドのために) ユーザーに表示され、ビルドと共に保存されます。

BUILD_DIR​ 内のアプリケーションは、compile​ スクリプトで加えられたすべての変更と共に slug にパッケージ化されます。

ENV_DIR​ は、アプリケーションの各環境設定​のファイルを含むディレクトリです。環境設定は、Procfile​ で指定されたコマンドの実行中や、1 回限りのプロセス​の実行時に環境変数として使用可能になります。

compile​ スクリプトの実行時に、ENV_DIR​ で入手できるアプリ環境設定のうち、1 つもなし、すべて、または一部を buildpack がオプションでエクスポートできるように、アプリケーション環境設定は引数として buildpack に渡されます (これに対して、設定は環境で行われる)。設定のエクスポートは、コンパイルスクリプト内の特定のステップにのみ、またはコンパイルフェーズ全体にスコープ指定できます。 アプリケーション環境設定が個々のファイル内のコンパイルスクリプトに渡される理由は、buildpack が複数行の値を持つ環境設定を正しく簡単に処理できるようにすることです。

ファイルの名前が設定キーであり、ファイルの内容が設定値です。環境設定 S3_KEY=8N029N81​ と等価なものは、名前が S3_KEY​ で内容が 8N029N81​ であるファイルです。

ENV_DIR​ の内容を環境にエクスポートする方法を示す Bash 関数を次に示します。

export_env_dir() {
  env_dir=$1
  acceptlist_regex=${2:-''}
  denylist_regex=${3:-'^(PATH|GIT_DIR|CPATH|CPPATH|LD_PRELOAD|LIBRARY_PATH)$'}
  if [ -d "$env_dir" ]; then
    for e in $(ls $env_dir); do
      echo "$e" | grep -E "$acceptlist_regex" | grep -qvE "$denylist_regex" &&
      export "$e=$(cat $env_dir/$e)"
      :
    done
  fi
}

正規表現を使用して、エクスポートのための設定キーをブロックリストまたは許可リストに登録します。たとえば、PATH などの環境設定はビルドツールと競合する場合があるため、ブロックリストに登録することは良い考えです。ビルドの実行に環境設定の特定のサブセット (DATABASE_URL​ など) のみが必要であることがわかっている場合は、許可リスト登録が推奨されます。

コンパイルフェーズ中には、次の環境変数を使用できます。

  • STACK​: これを使用する方法についての詳細は、後の「スタック」のセクション​を参照してください。
  • SOURCE_VERSION​: 現在ビルトされているソースコードの “バージョン”​。Git プッシュビルドの場合、これは Git コミットの SHA-1 ハッシュです。

スタイル

buildpack 開発者には、出力を表示するときに Heroku プッシュスタイルと照合することをお勧めします。

-----> Main actions are prefixed with a 6-character arrow
       Additional information is indented to align

可能な場合は常に、使用されているソフトウェアのバージョンを表示します。

-----> Installing dependencies with npm 1.0.27

副作用

buildpack 開発者は、ビルド中に副作用が発生することを回避する必要があります。たとえば、コンパイルスクリプトでデータベース移行を実行することはお勧めできません。

例

#!/bin/sh

indent() {
  sed -u 's/^/       /'
}

echo "-----> Found a hello.txt"

# if hello.txt has contents, display them (indented to align)
# otherwise error

if [ ! -s $1/hello.txt ]; then
  echo "hello.txt was empty"
  exit 1
else
  echo "hello.txt is not empty, here are the contents" | indent
  cat $1/hello.txt
fi | indent

bin/release

使用法

bin/release BUILD_DIR

まとめ

addons​ は、アプリが初めてデプロイされるときにのみ適用されます。

BUILD_DIR​ はアプリの場所になります。

このスクリプトは、次の 2 つのキーを含む YAML 形式のハッシュを返します。

  • addons​ は、インストールするデフォルトのアドオンの一覧です。
  • default_process_types​ は、デフォルトの Procfile​ エントリのハッシュです。

このスクリプトは、存在する場合にのみ実行されます。

注意: buildpack の export​ スクリプトは bin/release​ が実行されるより前に供給されないため、export​ に設定されるすべての環境変数は利用できません (ランタイムバイナリを PATH​ に追加するものなど)。それらが必須の場合、export​ スクリプトを手動で供給する必要があります。

例

#!/bin/sh

cat << EOF
---
addons:
  - heroku-postgresql
default_process_types:
  web: bin/node server.js
EOF

default_process_types​ を使用する代わりに、デフォルトの Procfile​ を作成することもできます (提供されていない場合)。

.profile.d スクリプト

起動中、コンテナは、dyno のコマンドを実行する前に .profile.d/​ ディレクトリ内のすべての .sh​ スクリプトを提供する bash​ シェルを起動します。アプリケーションの環境設定​は、スクリプトが提供された時点ですでに環境内に存在します。

これにより、buildpack は、アプリ内のすべての dyno タイプに対して初期の環境を操作できます。潜在的なユースケースには、環境へのエクスポートによる $PATH​ などの初期の設定値の定義や、dyno の起動中に必要な他の初期化手順の実行が含まれます。

標準の Linux /etc/profile.d​ シェル起動ファイルと同様に、これらは bash​ スクリプトである必要があり、そのファイル名は .sh​ で終わる必要があります。これらのスクリプトが提供される順序に関する保証は何もありません。

.profile.d/​ 内のスクリプトは buildpack からのみ書き込まれる必要があります。dyno が起動した時点でアプリケーション固有の初期化タスクを実行する必要がある場合は、.profile.d/​ 内のスクリプトの後に実行されることが保証されている .profile スクリプト​を使用する必要があります。

.profile.d/mybuildpack-defaults.sh の例

スクリプトファイル名の前に一般的な識別子を (たとえば、buildpack の名前に基づいて) 付加することをお勧めします。そうしないと、アプリケーションで同じスクリプトファイル名が使用されている複数の buildpack を使用​した場合は衝突の可能性があります。

# add vendor binaries to the path
export PATH=$PATH:$HOME/vendor/bin

# set a default LANG if it does not exist in the environment
export LANG=${LANG:-en_US.UTF-8}

既存の環境設定値の上書きを回避するために、$LANG​ 変数に対して上記の ${var:-default}​ のパラメータの置き換え​などの手法を使用してください。

複数の buildpack の構成

アプリは、順番に実行される複数の buildpack で構成 できます。 以降の buildpack に環境を提供するために、buildpack は、次の buildpack が実行される前に実行される $buildpack_dir/export​ スクリプトを作成できます。

たとえば、Node.js buildpack はこれを使用して、以降の buildpack が使用するノードバイナリ​を提供します。

キャッシング

CACHE_DIR​ に大量のデータを保存する場合は注意が必要です。それは、このディレクトリのすべてのコンテンツが S3 に保存され、このアプリがビルドされるたびにネットワーク転送する必要があるためです。大きな CACHE_DIR​ によって、ビルドプロセスに大幅な遅延が起きる場合があります。

bin/compile​ スクリプトには、その 2 番目の引数として、ビルド間で成果物を保存するために使用できる CACHE_DIR​ が付与されます。このディレクトリに保存された成果物は、連続したビルド中に CACHE_DIR​ で入手できます。このビルドキャッシュ​は slug のコンパイル中にのみ使用でき、ビルドされているアプリに固有のものです。

buildpack は、キャッシュを使用する予定がある場合、CACHE_DIR ディレクトリを作成する必要があります (存在しない場合)。

buildpack は多くの場合、このキャッシュを使用して解決済みの依存関係を保存することにより、連続したデプロイでのビルド時間を短縮します。

Heroku ユーザーは、heroku-builds​ プラグインを使用して、アプリに使用している buildpack によって作成されたビルドキャッシュを消去できます。

スタック

Heroku は、スタック​と呼ばれる複数の OS ベースイメージをサポートしています。

buildpack を保持しているユーザーには、その buildpack が、Heroku でサポートされるすべてのスタックで動作する slug を作成できるようにする責任があります。Heroku がアプリの slug を作成するために buildpack を実行する場合、そのビルドは常に、ビルドが実行されているアプリと同じスタックを使用して dyno で実行されます。さらに、buildpack がビルドの宛先スタックを特定できるように、コンパイルフェーズ中に STACK​ 環境変数が使用可能になります。STACK​値の例として heroku-20​ や heroku-22​ があります。

buildpack で特定のスタックがサポートされていない場合、コンパイルスクリプトはオプションでエラーを出力し、0 以外の終了コードで終了できます。ただし、Heroku では、すべてのスタックをサポートすることをお勧めします。

buildpack は、STACK​ 変数を使用して、そのスタックに適したバイナリやその他の依存関係を選択的にプルする必要があります。一般に、buildpack によってベンダリングされるバイナリは、互換性を確保するために、スタックごとに異なるバージョンでビルトする必要があります。詳細は、次の「バイナリ​」のセクションを参照してください。

バイナリ

buildpack は、アプリに関する完全な実行可能パッケージをビルドする役割を担っています。これには、アプリが動作するために必要な言語 VM やその他のシステムの依存関係の追加が必要になる可能性があります。

依存関係をビルドしてパッケージ化する場合は、これらが Heroku で現在使用されているスタック​と互換性があることを確認してください。依存関係をスタックごとに個別にコンパイルして配布したり、現在ビルトされているアプリの適切なセットでベンダリングしたりすることが必要になる場合があります。それを行うための 1 つの方法は、たとえば heroku run​ を使用して、Heroku dyno で依存関係をビルドすることです。

buildpack の公開と共有

buildpack を Heroku コミュニティと共有する場合は、buildpack を登録​できます。登録すると、その buildpack は heroku buildpacks:search​ CLI コマンドと Heroku Elements​ で表示されます (2018 年後半)。

buildpack の例

buildpack の作成を開始するための最も簡単な方法は、既存の多くの buildpack のいずれかを検証またはフォークすることです。

  • デフォルトの buildpack
  • サードパーティの buildpack

関連カテゴリー

  • 開発ビルドパック
Testpack API Buildpack Registry

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2025 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices