我有一个小的Laravel4项目,我需要合并一个第三方库。这个库不能通过GIT或Packagist获得(只能从供应商处获得),所以我将它下载到我的vendor
目录中(必须添加一些自定义供应商和包目录)。
而不是仅仅include()
-它建议的供应商的文档,我希望只是使用现有的Composer自动加载器,可以用手弄清楚我做错了什么。
目录树是这样的
path/to/project
|__ app
|__ vendor
| |__ merchantcompany
| |__ client
| |__ src
| |__ client.php
|__ blah
|__ blah
我更新了我的compser.json
包括:
"autoload": {
"psr-4": {
"MerchantCompany\": "vendor/merchantcompany/client/src"
},
...
我也试了试"MerchantCompany\": "src"
,但是没有效果。
我错过了什么?
注意:来自供应商的类没有命名空间。
我的假设是正确的吗?还是应该在类脚本中添加名称空间?
你现在做错了。您手动将包注入到由Composer管理的文件夹中(如果合适的话,Composer可以删除该目录),并将自动加载类型合并到您自己的代码中。
Composer提供了一种将所需的元数据添加到没有元数据的项目中的方法。这是https://getcomposer.org/doc/04-schema.md#repositories
中描述的"包"类型的存储库。如果你看一下Smarty给出的例子,你会发现你基本上需要添加一个值为"package"的键"type"和一个键"package",其中包含你希望在项目中看到的composer.json
文件的内容。
在这种情况下,添加了一个版本标签(与正在使用的Smarty版本同步,以防某些以后的版本使用Composer和Packagist, Smarty从一些版本3.1.x开始),以允许Composer引用该版本,该包的名称(如果你怀疑你是否会获得具有Composer支持的软件,这两个值可以任意组合)。和一个下载代码的URL(如果你不知道ZIP下载和存储库,你不必同时提供)。
缺少的是自动加载的定义,它可以像其他地方一样添加。如果其他方法都不起作用,请使用"classmap"。然后,Composer将扫描所有文件中出现的类、接口和特征,并生成一个包含相应文件名的数组。但是,如果代码符合该标准,您也可以使用PSR-0或PSR-4。
注意PSR-4只能用于使用名称空间的类!如果没有名称空间,则必须使用PSR-0或classmap。从目录列表的一小段来看,我怀疑代码是否与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"
}
PSR-4是一个基于名称空间的自动加载标准。如果供应商的PHP包不使用名称空间,您将无法使用它。
如果包的文件是基于类的(不是像helper文件那样的过程函数),那么你可以使用Composer的classmap
自动加载器。否则,您可以使用files
自动加载器,它基本上在每个请求中都包含文件,无论您是否使用它。
请注意,由于您是手动定义这些文件的路径,因此它们不需要位于vendor
文件夹中。我建议你把图书馆放在一个不同的,非。gitignore文件夹,因为它是一个外部依赖,你不能通过Composer自动包含到你的项目中。
当然,你总是可以唠叨你的供应商更新他们的包,以更符合PSR-4和命名空间之类的东西。:)