66

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

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

4

2 に答える 2

104

Composer のドキュメントには、2 つの基本的な例が示されています。私は説明しようとします:

このパッケージに置き換えられるパッケージを一覧表示します。これにより、パッケージをフォークし、独自のバージョン番号を持つ別の名前で公開できますが、元のパッケージを必要とするパッケージは、元のパッケージを置き換えるため、フォークで引き続き機能します。

あなたのソフトウェアが と を使用original/libraryother/package、それ自体も を必要とするとしますoriginal/library

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

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

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

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

Composerbetter/libraryoriginal/libraryother/package.

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

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

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

私の最初の答えで、私は提案しました:

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

これには結果があります。Composer は、ライブラリ バージョン 1.0.0 を元のライブラリの任意のバージョン 1.x と同じように扱うようになりました。修正や機能の追加を行い、バージョン 1.2.34 をいつかリリースしたとしてもです。これはまた、other/packageある日更新を取得して が必要になった場合、あなたoriginal/library:^1.1のライブラリの置換 はまだアクティブであり、内部で何も更新しなくても、 ANY バージョン を置き換えることができると述べています-それはできません。古いコードは決して新しいなんらかの作業を行わなくても元のライブラリの機能を使用できますが、置き換えはまさにこれを述べています。1.*

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

于 2013-09-19T21:17:33.623 に答える