我有一个小型的Laravel4项目,我需要在其中加入第三方库。该库不能通过GIT或Packagist(仅来自供应商)提供,因此我将其下载到我的vendor
目录中(必须添加一些客户供应商和软件包目录)。
而不仅仅是include()
- 正如供应商的文档所建议的那样,我希望只使用现有的Composer自动加载器,并且可以用手来弄清楚我是什么&#39我做错了。
我的目录树是这样的
path/to/project
|__ app
|__ vendor
| |__ merchantcompany
| |__ client
| |__ src
| |__ client.php
|__ blah
|__ blah
我更新了compser.json
以包含:
"autoload": {
"psr-4": {
"MerchantCompany\\": "vendor/merchantcompany/client/src"
},
...
我也试过"MerchantCompany\\": "src"
,但无济于事。
我错过了什么?
注意:供应商的类不是命名空间 我是否正确地假设这很好,或者我应该在类脚本中添加命名空间吗?
答案 0 :(得分:2)
你目前做错了。您手动将软件包注入由Composer管理的文件夹(如果认为合适,可以擦除该目录),并将自动加载类型合并到您自己的代码中。
Composer提供了一种向没有它们的项目添加所需元数据的方法。这是https://getcomposer.org/doc/04-schema.md#repositories
中描述的“包”类型的存储库如果你看一下Smarty给出的例子,你会发现你基本上需要添加一个值为“package”的密钥“type”和一个带有composer.json
文件内容的密钥“package”我希望看到项目中包含的内容。
在这种情况下,添加了一个版本标记(与正在使用的Smarty版本同步,以防某些更高版本使用Composer和Packagist,Smarty从版本3.1.x开始使用)以允许Composer引用此版本,该程序包的名称(如果您怀疑自己将获得具有Composer支持的软件,则可以任意组合这两个值),以及从中下载代码的URL(您不必同时提供这两个值) ZIP下载和存储库,如果你不知道它们。)
缺少的是自动加载的定义,可以像其他地方一样添加。如果没有其他工作,请使用“classmap”。然后,Composer将扫描所有文件以查找类,接口和特征的出现,并生成包含附带文件名的数组。但是,如果代码符合该标准,您也可以使用PSR-0或PSR-4。
请注意,PSR-4只能用于使用命名空间的类!如果没有名称空间,则必须使用PSR-0或类映射。从目录列表的短片我怀疑代码是否与PSR-0兼容,所以只需使用classmap即可获得快速结果。
作为建议:
"repositories": [
{
"type": "package",
"package": {
"name": "merchantvendor/client",
"version": "1.0.0",
"dist": {
"url": "http://example.com/zip-download-url.zip",
"type": "zip"
},
"autoload": {
"classmap": ""
}
}
}
],
"require": {
"otherstuff": "...",
"merchantvendor/client": "1.0.0"
}
答案 1 :(得分:0)
PSR-4是基于命名空间的自动加载标准。如果您的供应商的PHP包不使用名称空间,您将无法使用它。
如果包的文件是基于类的(不是像助手文件那样的过程函数),那么您可以使用Composer's classmap
自动加载器。否则,您可以使用files
自动加载器,无论您是否使用它,基本上都会在每个请求中包含该文件。
请注意,由于您是手动定义这些文件的路径,因此它们不需要位于vendor
文件夹中。我实际上建议您将库放在另一个非.gitignore文件夹中,因为它是一个外部依赖项,您无法通过Composer自动将其包含到项目中。
当然,您总是可以唠叨供应商更新他们的软件包,以便更加符合PSR-4和命名空间等内容。 :)