嗨,我正在尝试在Laravel 5.1中开发一个软件包。感谢这里的帮助,我已经建立了基础知识。
我当前的问题是在开发程序包时如何为程序包加载依赖项。
在软件包composer.json
中,我添加了依赖关系,并将其现在安装在我的软件包开发文件夹中的vendor文件夹中。这不是框架根供应商文件夹。
这是composer.json
包的我的require部分:
"require": {
"illuminate/support": "~5.1",
"php" : ">=5.3.0",
"google/apiclient": "dev-master"
},
因为它们不是主要自动加载过程的一部分,所以什么是最好的方法来确保从开发文件夹中正确加载我的程序包的依赖项?如何包含自动加载功能?我担心如果我将它们引用到它们的当前位置/ namespace ,则在以后将其作为软件包安装在另一个应用程序中时,它将断开。
在我的代码中,我有以下内容:
$client = new \Google_Client($config);
这给出了错误:
Class 'Google_Client' not found
我可以通过将这种依赖关系添加到主composer.json来解决这个问题,但不要认为这是保持程序包开发独立性的正确方法(如果这样的话)
当我在L4.2中进行开发时,有一个工作台来负责加载工作,这当然不再是L5.1中的功能
任何帮助和最佳做法表示赞赏
最佳答案
我认为您误解了如何管理 Composer 依赖性。在主compose.json文件中列出依赖项时,composer会将其及其所有依赖项,及其依赖项的依赖项等递归添加到主自动加载过程中。
您不必担心依赖项的存储位置或Composer如何加载它们。 Composer将自动将它们添加到autoload文件和中,您要做的就是确保您需要composer autoload文件。一旦您需要composer自动加载文件,composer加载的所有类和函数都将可用。如果您需要composer autoload文件,则要使用任何已安装软件包中的类的全部工作就是确保您使用正确的 namespace 对它们进行寻址。 Composer足够聪明,可以知道所有类的存储位置以及如何加载它们(这就是psr-0,psr-4等的用途)。
因此,如果您正在开发Composer程序包,则将其称为“A”,并将程序包“C”列为程序包“A”的依赖项之一,composer会为您将其添加到自动加载文件中。如果您使用另一个依赖于您的包“A”的Laravel软件包,那么由于依赖于“A”,因此包“C”也将在Laravel中可用。
即:如果这是您的composer.json文件
{
"name": "foo/bar",
"require": {
"google/apiclient": "1.0.*"
}
}
该代码将起作用
require_once __DIR__ . '/vendor/autoload.php';
$client = new Google_Client();
$youtube = new Google_Service_YouTube($client);
注意我需要 Composer 自动加载文件,这似乎是您的问题。当您使用Laravel时,它将为您添加该文件。