6

我现在正在处理 2 个应用程序。第一个是CMS,第二个是商店。我想将我的供应商提升一级并在项目之间共享。

所以我的结构将是这样的:

project1/
project2/
shared_vendor/

我读到了这个。我已将app/autoload.phploader 变量从:

$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 在每个项目的基础上工作。

一个项目 - 一个供应商文件夹。不是,两个项目和一个“共享”供应商文件夹。

我们使用 PEAR 的“共享”供应商文件夹方法已经足够长的时间了,但它根本没有成功。使用全局供应商文件夹管理不同的项目需求是一件很痛苦的事情,因为每个项目都有不同的需求。

反正...

如果您喜欢“共享供应商文件夹”设置,我建议创建类似“包装器”或“超级”项目的东西,它充当其他两个项目的容器存储库。包装器项目将包含composer.json具有两个(!)项目要求的文件。这意味着您正在处理两个子项目中的同一组依赖项。

这允许在“包装器”存储库中定义两个子项目(cms 和 shop)的要求。基本上,我建议采用以下结构:

|-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

然后你需要更改两个文件:

  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 回答
1

我知道这是一个老问题,但我遇到了同样的问题。我正在使用 Laravel 7,并通过以下方法解决了该问题。
我使用以下代码在项目的根目录中编写了一个 shellscript (my-vendor.sh):

 #!/bin/bash

MY_VENDOR_DIRECTORY=my-vendor
VENDOR_DIRECTORY=vendor

if [ ! -d "$MY_VENDOR_DIRECTORY" ]
then
  echo "Le dossier $MY_VENDOR_DIRECTORY n'existe pas : on le crée."
  mkdir "$MY_VENDOR_DIRECTORY"
else
  echo "Le dossier $MY_VENDOR_DIRECTORY existe : on le vide."
  rm -rf "$MY_VENDOR_DIRECTORY/*"
fi

echo "Copie des fichiers autoload généré depuis $VENDOR_DIRECTORY vers $MY_VENDOR_DIRECTORY."
cp "$VENDOR_DIRECTORY/autoload.php" "$MY_VENDOR_DIRECTORY"
cp -R "$VENDOR_DIRECTORY/composer" "$MY_VENDOR_DIRECTORY"

cd "$MY_VENDOR_DIRECTORY/composer"

echo "Remplacement de 'require \$file' par \str_replace(\"$MY_VENDOR_DIRECTORY\/composer\/..\", \"vendor\", \$file)"
sed -i "s/require \$file/require \\str_replace('$MY_VENDOR_DIRECTORY\/composer\/..', 'vendor', \$file)/" autoload_real.php

echo "Remplacement de 'include \$file' par \str_replace(\"$MY_VENDOR_DIRECTORY\/composer\/..\", \"vendor\", \$file) "
sed -i "s/include \$file/require \\str_replace('$MY_VENDOR_DIRECTORY\/composer\/..', 'vendor', \$file)/" ClassLoader.php

然后,我将以下代码替换为public/index.php

  • require __DIR__.'/../vendor/autoload.php'=> 由require __DIR__.'/../my-vendor/autoload.php';

之后,我在脚本中添加my-vendor.sh命令。post-autoload-dump

我在我的两个项目中做了这个修改,启动composer dump-autoload它就像一个魅力:)

要点的链接:https ://gist.github.com/flibidi67/7c2cfdc1ff1b977b48204be0bee5eb76

希望这可以帮助别人;)

于 2020-09-11T14:12:21.563 回答
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 回答