6

現在、2つのアプリケーションに取り組んでいます。1 つ目は CMS で、2 つ目はショップです。ベンダーを 1 つ上のレベルに移動し、プロジェクト間で共有したいと考えています。

したがって、私の構造は次のようになります。

project1/
project2/
shared_vendor/

私はこれについて読みました。app/autoload.phpローダー変数を次のように変更しました。

$loader = require __DIR__.'/../vendor/autoload.php';

に:

$loader = require __DIR__.'/../../vendor/autoload.php';

そして、私も変更vendor-dirしましたcomposer.json

    "config": {
      "bin-dir": "bin",
      "vendor-dir": "vendor"
    },

に:

    "config": {
      "bin-dir": "bin",
      "vendor-dir": "/../vendor"
    },

そして、この後、私はこのエラーが発生しています:

ClassNotFoundException in AppKernel.php line 20: Attempted to load 
class "CmsUserBundle" from namespace "Cms\UserBundle".
Did you forget a "use" statement for another namespace?

私は何を間違っていますか?何かを変更するのを忘れましたか?前もって感謝します。

4

4 に答える 4

7

Composer はプロジェクト単位で動作します。

1 つのプロジェクト - 1 つのベンダー フォルダー。2 つのプロジェクトと 1 つの「共有」ベンダー フォルダーではありません。

私たちは、PEAR で「共有」ベンダー フォルダ アプローチを十分長く使用していましたが、うまくいきませんでした。プロジェクトごとに要件が異なるため、グローバル ベンダー フォルダを使用してさまざまなプロジェクト要件を管理するのは大変です。

ともかく...

「共有ベンダー フォルダー」セットアップが気に入った場合は、他の 2 つのプロジェクトのコンテナー リポジトリとして機能する「ラッパー」または「スーパー」プロジェクトのようなものを作成することをお勧めします。ラッパー プロジェクトには、composer.json両方の (!) プロジェクトの要件を含むファイルが含まれます。これは、両方のサブプロジェクトで同じ一連の依存関係に対して作業していることを意味します。

これにより、「ラッパー」レポで両方のサブプロジェクト (cms とショップ) の要件を定義できます。基本的に、私は次の構造を提案しています:

|-container-project
  +-CMS
    |-src
    +-tests
  +-Shop
    |-src
    +-tests
  +-vendors      // contains dependencies for both projects (CMS + Shop)
|-composer.json  // define requirements for both projects

この設定によりcomposer.json、サブプロジェクトのファイルも導入できます。composer.jsonスーパープロジェクトのcomposer.jsonファイルからサブプロジェクトのファイルに要件を転送するだけです。

現在、オートローダーを特定の順序で登録することにより、サブプロジェクトのオートロード動作を微調整することも可能です。

于 2015-05-04T22:24:31.433 に答える
1

Laravel 5、6、および 7 以降の場合

新しいベンダー フォルダー構成を追加した後:

...
"config": {
    ...,
    "vendor-dir": "../vendor"
},
...

次に実行しますcomposer update

次に、2 つのファイルを変更する必要があります。

  1. アプリの場合:public/index.php

    require __DIR__.'/../../vendor/autoload.php';

  2. ルート フォルダー内の職人のコマンド:artisan

    require __DIR__.'/../vendor/autoload.php';

  3. でのパッケージの自動検出Illuminate\Foundation\PackageManifest:

    $this->vendorPath = $basePath.'/../vendor'; //Change this line in constructor

そして再実行

php artisan package:discover --ansi
于 2020-03-31T14:49:25.767 に答える
0

要件に基づいて、複数のプロジェクト間で共有する必要がある/共有したい唯一のものがベンダー ディレクトリである場合は、既にベンダー ディレクトリを持っているメインのプロジェクトを除いて、各プロジェクトにシンボリック リンクを作成できます。

例えば:

cd /var/www/SiteA
composer install
# git clone new project into /var/www/SiteB
cd ../SiteB
# If vendor directory is already there, delete it: rm -rf vendor
# create symlink to Site A's vendor directory
ln -s /var/www/SiteA/vendor

すべてのプロジェクトでまったく同じバージョンの依存関係が必要になることが確実にわかっていない限り、これは適切な計画ではない可能性があります。

于 2017-07-13T10:03:16.690 に答える