31

Zend Framework 2 アプリケーションがあります。これには、ビジネス ロジックを含むライブラリ コードと、後で作成される他のアプリケーションに共通するその他のユーティリティが含まれています。

私の意図は、Composer を使用してプロジェクト間で共有することです。問題は、これを適切に行い、開発を合理化するにはどうすればよいかということです。ほぼ確実に、他のプロジェクト内からライブラリに変更や追加を行う必要があります。

vendor/stuff必要なパッケージを含む git サブモジュールとして設定し、次composer.jsonのようにプライマリで参照してみました(ref) :

"repositories": [
    {
        "type": "git",
        "url": "vendor/stuff"
    }
],
"require": {
    "stuff/library": "master"
},

Composer は、この方法ではそれをロードできません。おそらく、URL がローカルであり相対であるという事実を無視しているため、パッケージが見つからないと不平を言っています。技術的には、そうする必要はありません。vendor/stuff フォルダーは、git サブモジュール コマンドによって個別に初期化されました。

4

4 に答える 4

51

残念ながら* Composer は Git サブモジュールをサポートしていません。Composer の主な目的は同様のプロジェクト間の依存関係機能を提供することであり、Composer でサブモジュールを複製しようとしても無意味です。

ライブラリを開発しながら、そのライブラリを使用するアプリケーションを同時に開発するという、あなたが解決しようとしているのと同じ問題があります。composer を使用するだけでこの問題を解決する方法がいくつかあります。

ライブラリ ディレクトリのシンボリック リンクを作成します。

これは、それを行うための最も迅速で汚い方法です。composer update を実行して、vendors ディレクトリにライブラリの適切なディレクトリを作成し、ライブラリを含むディレクトリからのシンボリック リンクに置き換えます。

composer update を実行して編集した可能性のあるコードを誤って上書きする可能性があるため、明らかにこれは良くありません。

Composer のソース優先オプションを使用する

--prefer-srcComposer には、デフォルトである zipball をダウンロードする ( ) のではなく、Git クローン ( ) を介してソースをダウンロードするオプション--prefer-distがあります。これにより、vendors ディレクトリ内のソース コードを編集し、Git 経由でコミットできます。

symfony/yamlたとえば、バグを修正したい他のライブラリの中で必要なプロジェクトがあるとします。あなたができることは次のとおりです。

  1. composer update- これにより、プロジェクトのすべての依存関係がダウンロードされます。

  2. composer update symfony/yaml --prefer-source- これによりsymfony/yaml、vendors ディレクトリ内のディレクトリのみが更新されます。

  3. バグを修正してから、git でコミットします。

Composer のローカル リポジトリを使用する

私が --- 実際に --- 私がプロジェクトを開発していて、それが並行して必要であるときに使用していた方法は、Composers 機能を使用して、依存関係を解決するために使用するリポジトリを明示的に設定することです。たとえば、コードが次の場所にある場合:

/projects/library/
/projects/project/

プロジェクトのコンポーザ ファイルに、次のリポジトリ エントリを追加します。

"repositories": [
    {
        "type": "vcs",
        "url": "/projects/library/"
    }
]

実行composer updateすると、/projects/library/ の Git エントリが参照され、Packagist または他のリポジトリにリストされているものより優先して、ライブラリの依存関係が解決されます。

これは、ライブラリ コードの変更をテストする場合、次のことを行う必要があることを意味します。

  1. Git エントリを持つようにコミットします。

  2. プロジェクト ディレクトリで Composer update を実行して、最新バージョンを取得します。

ただし、コミットを外部リポジトリにプッシュする必要がなくなります。これは、動作しない可能性のあるコードをプッシュしないことを意味し、Git コミットはインターネット接続を必要としないため、オフラインで作業できることを意味します。


これは明らかに最善の作業方法ですが、ローカル ディレクトリへの参照を含む composer.json のバージョンを誤ってチェックインするのは簡単すぎて、明らかに他のすべてのプロジェクトが壊れてしまうため、危険です。

これを回避するために、i) 実際の composer.json ファイルをバックアップする、ii) いくつかのローカル リポジトリを追加する、iii) 実行する、composer updateiv) 実際の composer.json ファイルを復元する、いくつかの小さなスクリプトを作成しました。

localupdate.sh

cp -f composer.json composer.json.bak
php composerLocal.php
composer update
cp -f composer.json.bak composer.json

composerLocal.php

<?php

$srcFile = file_get_contents("composer.json");
$hackFile = file_get_contents("composer.local");
$finalString = str_replace('"LOCALHACK",', $hackFile, $srcFile);
file_put_contents("composer.json", $finalString);

?>

composer.local

"LOCALHACK",

"repositories": [
    {
        "type": "vcs",
        "url": "/projects/library1"
    },
    {
        "type": "vcs",
        "url": "/projects/library2"
    }   
],

そして、プロジェクトファイル"//": "LOCALHACK",のどこかに配置します。composer.json実行localupdate.shすると、composer.json の悪いバージョンをコミットする可能性なしに、ローカル リポジトリに対して composer 更新が安全に行われます。

Git を使用して自分でクローンするだけです

これは私が今どのように仕事をする傾向があるかです:

i) プロジェクト内の Composer の更新 ii) vendors ディレクトリに移動し、同時に開発したいライブラリを削除します。iii) ライブラリを開発しているリポジトリから適切なベンダー ディレクトリに Git クローンを作成します。

Composer は git リポジトリを理解するので、git クローン ディレクトリを上書きしません (ただし、ライブラリの composer.json の編集について少し混乱しているようです)。

自分で git clone を実行すると、インストールされるものを完全に制御でき、プロジェクトで composer.json を編集することなく、composer が認識していないリポジトリまたはタグなしバージョンからインストールできます。

これが、自分で git clone を実行する際の重要な機能です。プロジェクトの composer.json に触れないことで、完全に安全になり、ローカル/カスタム リポジトリを使用するように変更された composer.json をチェックインする可能性がなくなります。

  • 編集 - 2014 年 9 月 6 日

"//": "LOCALHACK"composer.json ファイルの検証が強化され、ファイルにエントリを含めることができなくなりました。これは、Composer の連中が Composer プロジェクトのバージョン管理を行っていない理由の 1 つです。

* 実際には、Git サブモジュールは、難しい問題を「解決」するための愚かな、愚かな、愚かな実装であり、今後さらに多くの問題を引き起こすだけだと思います。明らかに、他の人がそれらを使用して満足しているので、それは私の意見ですが、Composer を使用している場合は、サブモジュールは必要ありません。

于 2013-08-08T15:44:08.080 に答える
1

Composer には自動ロード マッピング機能があり、ライブラリが PSR-x 標準に準拠している場合に、求めていることを実行するのに非常に役立ちます。同様の手順に従って、psr-x 以外のライブラリを自動ロードすることもできます。

ここで参照: https://getcomposer.org/doc/04-schema.md#autoload

例を作ってみましょう (ライブラリが PSR-4 標準に従っていると仮定します)

lib/your-private-git-repo フォルダーにサブモジュールを複製したとします。

あなたがしなければならないことは、composer.jsonファイルの autoload セクションに追加することだけです:

{
    "name": "YourNamespace/YourApplicationName",
    "description": "Describe your library",
    "license": "Your licen",
    "keywords": ["some","keywords"],
    "authors": [
        {
            "name": "Adamo Aerendir Crespi",
            "email": "hello@aerendir.me"
        }
    ],
    "require": {
        "joomla/framework": "*@stable"
    },
    "require-dev": {
        "phpunit/phpunit": "*@stable"
    },
    "autoload": {
        "psr-4": {
            "YourNamespace\\YourSubmodule\\": "lib/your-private-git-repo/src"
        }
    }
}

コードの下から 6 行目にある行に注目してください。

    "autoload": {
        "psr-4": {
            "YourNamespace\\YourSubmodule\\": "lib/your-private-git-repo/src"
        }
    }

Composerを今すぐ更新

php composer.phar update

このようにして、Composer はサブモジュールを含む autoload ファイルも更新します。

すべて完了: サブモジュールが Composer によって自動ロードされます。

これが役立つことを願っています。

于 2015-01-21T23:30:32.463 に答える