web-dev-qa-db-ja.com

「置換」プロパティはコンポーザーでどのように機能しますか?

では、 " replace "プロパティは composer でどのように機能しますか? composerドキュメントを読みましたが、まだ理解していません。詳細情報を検索しても質問に答えていません。

Githubで Laravel/Framework のcomposer.jsonファイルを見ると、置換がどのように機能するかわかりません。誰かがこれがどのように機能するか説明してくれますか?そして、変数「self.version」は何に等しくなりますか?

42
Ilyes512

Composerのドキュメントには、2つの基本的な例があります。説明しようと思います。

このパッケージに置き換えられるパッケージをリストします。これにより、パッケージをフォークし、独自のバージョン番号を付けて別の名前で公開できます。元のパッケージを必要とするパッケージは、元のパッケージを置き換えるため、フォークで引き続き動作します。

ソフトウェアがoriginal/libraryおよびother/packageを使用していると仮定します。これらもoriginal/libraryを必要とします。

original/libraryは機能を統合する必要があると思いますが、メンテナーはあなたの提案をパッケージで行わせません。そのライブラリをbetter/libraryという名前でフォークし、新しいリリースにタグを付けることにします。

ソフトウェアに戻ります。もちろんbetter/libraryの使用を開始する必要があるため、代わりにそれが必要ですが、そのother/packageは依然としてoriginal/library-コードの複製が必要です!フォークせずにcomposer.jsonを変更するだけで、代わりにbetter/libraryを使用するように他のパッケージを作成するにはどうすればよいですか(まだoriginal/libraryと互換性があるため、動作するはずです)。

composer.jsonに置換キーを追加します:

"replace": {
    "original/library":"1.0.2"
}

これでComposer=は、better/libraryの依存関係を解決するときに、original/libraryからのパッケージがother/packageと同等に優れていることを認識します。

これは、サブパッケージを含むパッケージにも役立ちます。たとえば、メインのsymfony/symfonyパッケージには、個々のパッケージとしても利用可能なすべてのSymfonyコンポーネントが含まれます。メインパッケージが必要な場合は、個々のコンポーネントが置き換えられるため、個々のコンポーネントのいずれかの要件を自動的に満たします。

同じ規則、わずかに異なる角度:フレームワークのコンポーネントを要求することは、何らかの機能を必要とする他のコンポーネントにとっては良いアプローチです。ただし、ソフトウェアに完全なフレームワークと、そのフレームワークのコンポーネントも必要とする別のライブラリが必要な場合、フレームワークのreplace宣言により、Composer完全なフレームワークに既に含まれているため、その単一のコンポーネントを2回インストールします。

注意:置き換えられたバージョンのプレースホルダーは通常不良です

私の元の答えで私は提案しました:

"replace": {
    "original/library":"1.*"
}

これには結果があります:Composerは、バージョンを修正したり、機能を追加したりバージョン1.2をリリースした場合でも、ライブラリバージョン1.0.0を元のライブラリのバージョン1.xと同等に処理します.34いつか。これは、other/packageいつかが更新されてoriginal/library:^1.1を必要とする場合、[〜#〜] your [〜# 〜]ライブラリはまだアクティブで、内部で何も更新しなくても、任意のバージョン1.*を置き換えることができると述べています。作業を行わずに元のライブラリを使用しますが、置換にはまさにこれが記載されています。

本質的には、置換バージョンではワイルドカードバージョンを使用しないでください。それらを使用する場合、あなたが知ることも予測することもできない未来についての声明を出します(original/libraryを制御できない限り、しかしそれでも非常に注意してください)。常に知っている、完全に再実装できるoriginal/libraryの特定のバージョンを使用してください。

73
Sven

独自のパッケージを作成するときは、composer.jsonどの種類のパッケージがそれを行うか provide これは基本的にComposerにパッケージが既にインストールされていることを伝えます、再インストールする必要はありません。

replace property を使用すると、Composerは、パッケージが元のパッケージを独自のフォークに置き換えたいため、他のパッケージがそれをインストールする必要があります。

たとえば、a/aパッケージにはb/bそして、あなたはb/b、Composer install/updateにはダウンロードされません。

これについては、ここで詳しく説明します。 Composerで「置換」プロパティはどのように機能しますか?

How does the “replace” property work in Composer - diagram

5
kenorb