web-dev-qa-db-ja.com

composer prefer-distとprefer-sourceの違いは?

PHP Composerのinstallコマンドのヘルプを見ると、次の2つのオプションがあります。

$ composer help install
Options:
 --prefer-source            Forces installation from package sources when possible, including VCS information.
 --prefer-dist              Forces installation from package dist even for dev versions.

「dist」インストールとは何ですか?私はcomposerサイトとGoogleをざっと見ましたが、これに対処するものは何もないようです(Composerに精通している人にとっては、これはコアで明白なものだと思います—初心者の質問)

--prefer-sourceはComposerがPackagistにリポジトリの場所を尋ね、checkout/clone/export/etcとなると想定しています。プロジェクト自体。

その場合、--prefer-distはどこからダウンロードしますか?何をダウンロードしますか?

44
Alan Storm

http://getcomposer.org/doc/03-cli.md によると、--prefer-sourceオプションは、「バージョン管理リポジトリ」であるパッケージディレクトリの作成を優先します。これは、次のように入力するのと同じです。

$ git clone ...

または

$ svn checkout ...

--prefer-distオプションは、「バージョン管理リポジトリ」以外の作成を優先します。これは、次のように入力するのと同じです。

$ git clone ... ; rm -fr dir/.git

または

$ svn export ...

また、composer.jsonsourcedistに個別のリポジトリを定義できます。次に例を示します。

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "joshuaclayton/blueprint-css",
                "version": "master",
                "source": {
                    "url": "git://github.com/joshuaclayton/blueprint-css.git",
                    "type": "git",
                    "reference": "master",
                }
            }
        },
        {
            "type": "package",
            "package": {
                "name": "fiftyone/mobi-lite-php",
                "version": "2013.03.06",
                "dist": {
                    "url": "http://iWeb.dl.sourceforge.net/project/fiftyone/51Degrees.mobi-Lite-2013.03.06.php.Zip",
                    "type": "Zip"
                },
            }
        }
    ]
}

注:何らかの理由で--prefer-distを使用すると、次のようなエラーが発生することがあります

Fatal error: Cannot redeclare class Zend_Db_Adapter_Pdo_Abstract in ...

--prefer-sourceを使用すると表示されません。このため、この問題の原因が判明するまでは、--prefer-sourceのみを使用します。

39
Ross Smith II

私は感心したり、提供された回答を承認したりしません質問に対応していません。少し古すぎるにもかかわらず、この質問へのさらなる参照のためにこの回答を投稿しています。


基本:

通常composerはtagsを扱います(1.2.7のように)ですが、常にそうであるとは限りません。branchdev-masterのような)依存関係として。

  • composerにtagを要求する場合)、ローカル(vendorディレクトリのどこかに)にファイルをコピーするだけです。

  • composerでタグの代わりにbranchをチェックアウトしたい場合は、可能性があります(composerの合理的な仮定)。 composer cloneローカルのリポジトリ(ここでも、vendorディレクトリのどこか))。


だから何?!

質問:

tagが必要で、それでもローカルで開発できるようにするにはどうすればよいですか?

回答:

--prefer-sourcecomposer installcomposer update、またはcomposer requireコマンドとともに使用します。

composer install symfony/symfony:3.4.* --prefer-source

質問:

最新の開発を必要とする場合branchが、新しいものを取得したいだけで、その開発に従事したくない場合はどうなりますか?

回答:

--prefer-distcomposer installcomposer update、またはcomposer requireコマンドとともに使用します。

composer install symfony/symfony:dev-master --prefer-dist
10
Pmpr

Composer's Documentation で明確に述べられているように:

実際、内部的にComposerはすべてのバージョン個別のパッケージ。Composerを使用している場合、この区別は重要ではありませんが、変更する場合は非常に重要です。

そして、

Dist:distはパッケージデータのパッケージバージョンです。通常はリリースされたバージョン、通常は安定したリリース

Source:ソースは開発に使用されます。これは通常gitなどのソースコードリポジトリから発生します。ダウンロードしたパッケージを変更したい場合に取得できます。

そう、

パッケージは、これらのいずれか、または両方を提供できます。ユーザー提供のオプションやパッケージの安定性などの特定の要因に応じて、1つが優先されます。

ブランチをチェックアウトしている場合は、ブランチで作業することを想定しており、Composerは実際にリポジトリをベンダーディレクトリの正しい場所に複製します。

タグの場合、実際にリポジトリを複製せずに、適切なファイルをコピーするだけです。

3
wujt