Composer、Laravel 和本地包
Posted
技术标签:
【中文标题】Composer、Laravel 和本地包【英文标题】:Composer, Laravel and local packages 【发布时间】:2014-04-25 22:13:56 【问题描述】:我的问题是我有一个不是存储库的包,我正试图让它与 Laravel 和作曲家配合得很好。它仍然位于 vendor 文件夹下,唯一的问题是,如果我简单地设置:
"psr-0":
"Test\\Test": "vendor/test/test/src/"
这将加载服务提供者,但控制器等都不会自动加载。用没有自己的存储库的 larval 实现包的正确方法是什么。或者这是否违背了包的性质,而这应该只是在应用程序控制器下进行结构化。
这个包是我使用工作台创建的,但我发现我并不真的需要将它作为一个单独的存储库,但将它作为一个包保存仍然很好。因此结构与普通包完全相同:
vendor
testvendor
testpackage
public
src
tests
.gitignore
composer.json
phpunit.xml
更新:
作为我目前使用的解决方案:
"autoload":
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"vendor/package"
]
,
作为类映射中的一个条目。展望未来,我可能会将其重构到 app 文件夹或为此包创建存储库。
【问题讨论】:
我们需要更多相关信息。这个包是什么?它只是您复制给供应商的一堆文件,还是存储在您可以下载的服务器中的东西?它有作曲家包结构吗?谁创建了这个包?你能把它做成一个作曲家包并存放在家里吗?你能至少告诉我们这个包的目录结构吗? 为什么vendor文件夹里有非composer包?? 您是否建议将其移至 app/vendor 或类似网站?关于其他事情,我现在将更新问题。 我认为你应该为你的包创建一个 workbench 而不是把它放在vendor
文件夹中。您的自定义包的格式应为workbench
我最初确实有它在工作台下(在开发时),但工作台包不应该在生产环境中使用是我的理解吗?如果我要从中创建一个包,那么是的,我会在开发时将它移到工作台中,如果我在这里遗漏了什么,请告诉我。
【参考方案1】:
如果你有一些你称之为“包”的类,你不应该将这些文件添加到你的供应商文件夹中。此文件夹由作曲家管理,您随时可能会丢失它。在您的应用程序中创建一个子文件夹并将这些文件放在那里。
您必须确保 PSR-0 自动加载功能适用于文件夹结构中的每个文件。所以,如果你的根是 vendor/test/test/src/
并且你的命名空间是
Test\\Test
你所有的文件都必须在
vendor/test/test/src/Test/Test/ClassFileName.php
PSR-4 更容易处理和理解,这个
"psr-4":
"Test\\Test\\": "vendor/test/test/src/"
意味着您的文件必须是这样的:
vendor/test/test/src/ClassFileName.php
仔细检查您的命名空间。使用带有 PSR-0 的命名空间时很容易出错,请记住
composer dump-autoload
每次更改 composer.json 或创建新文件时都必须运行。如果是简单的类自动加载,每次创建文件,如果是 PSR-X 自动加载,每次在 composer.json 文件中创建或更新命名空间。
如果你真的是一个包,你应该使用 Composer:当你的包被构造为一个 composer 包时(以 Laravel 的 composer.json 为例),将它添加到你的应用程序的正确方法,如果不是Packagist 中的列表,通过 repositories
.
您可以在公共 VCS 存储库中拥有(非打包师)软件包:
"require":
"monolog/monolog": "dev-bugfix"
,
"repositories": [
"type": "vcs",
"url": "https://github.com/igorw/monolog"
]
您可以在受密码保护的 VCS 存储库(git、bitbucket...)中拥有(非打包专家)包:
"require":
"vendor/my-private-repo": "dev-master"
,
"repositories": [
"type": "vcs",
"url": "git@bitbucket.org:vendor/my-private-repo.git"
]
您可以将您的包压缩到您的硬盘驱动器中并通过artifact
存储库类型加载它们:
"repositories": [
"type": "artifact",
"url": "path/to/directory/with/zips/"
],
【讨论】:
感谢您的详细回复。我阅读了文档,问题在于它不是存储库。我目前的解决方案是将供应商/odeon 添加到类映射中,现在一切正常。我不是 100% 这是解决我的问题的正确方法,一切正常。 如果您为同一个包混合了多种自动加载方法,那并不理想。但是,如果您现在只是使用类映射,是的,它会起作用,只是您可能必须在每次创建新类时执行composer dump-autoload
。
我会暂时保持这样,但是通过 cmets 我应该将它重构到 app 文件夹中,或者将此包作为存储库。我会接受这个作为解决方案,因为它确实解释了什么是“正确的方法”。【参考方案2】:
虽然@Antonio Carlos Ribeiro 的回答非常好,但我在本地安装自定义包时遇到了问题(在他回答的最后部分也有说明)
假设这是我们尝试安装的包的目录结构:
D:/test_pack
src/
composer.json
如果您不想将自定义包(很可能是您自己开发的)上传到在线存储库,您可以使用以下两种方法之一:
方法一
(你必须为你的包指定版本,否则你会得到这个错误:在任何版本中都找不到请求的包,可能包名有错别字。)
1) 在 composer.json 中,将版本添加到您的包中。你的包的 json 应该是这样的:
"name": "gandalf/test_pack",//This is your package's name
"description": "some desc",
"version": "1.0.0",//This is the version that you have to specify
"authors": [
"name": "gandalf the grey",
"email": "fake@yahoo.com"
],
"minimum-stability": "dev",
"require":
"laravel/framework": "~5.4"
,
"autoload":
"psr-4":
"Gandalf\\BotPack\\": "src/"
2) 压缩你的包(假设压缩文件在 D:/test_pack/test_packa.zip)
3) 在 laravel 的 composer.json 中添加你的包名(在我们的例子中是 gandalf/test_pack 到 json 的 require 部分)并将存储库数组添加到 composer.json 文件中,并在该数组中指定你的包的 zip 所在的目录文件存在(在我们的例子中是 D:/test_pack)。像这样
...,
"require": //adding our package name to laravel's composer.json
...,
"gandalf/test_pack": "*"//package's name
,
...,
"repositories": [
"type": "artifact",
"url": "D:/test_pack"
]
方法二(我最喜欢的方法,你必须使用git init
然后git add .
和git commit -m "your message"
将你的包目录初始化为git本地存储库)
1) 将包目录初始化为 git 目录并将所有更改提交到本地存储库
(假设D:/test_pack
是包含您的包的目录(src/
目录和composer.json
))
转到D:/test_pack
目录并运行这些命令
git init
git add .
git commit -m "your message for this commit"
2) 在你的包composer.json
文件中添加最低稳定性
"name": "gandalf/test_pack",
"description": "some desc",
"authors": [
"name": "gandalf the grey",
"email": "fake@yahoo.com"
],
"minimum-stability": "dev",//setting minimum-stability
"require":
//dependencies that your package needs
,
"autoload":
"psr-4":
"Gandalf\\BotPack\\": "src/"
3)在 laravel 的 composer.json 文件中需要你的包的“dev-master”
...,
"require":
...,//some dependencies that laravel needs
"gandalf/test_pack": "dev-master"//requiring dev-master from repository
,
"repositories": [
"type": "git",
"url": "D:/test_pack"//path of the local repository directory which contains your package
]
【讨论】:
【参考方案3】:为任何 Laravel 项目加载本地包。它存储在您的机器中。
在laravel的(Project)composer.json
文件中添加
"autoload":
"psr-4":
"YourPackage\\Namespace\\": "./local_Package_path/src"
,
并在 Laravel 项目目录中触发命令
composer dump-autoload
可选
如果包在您的项目中仍然不可用。然后 注册您的包裹的服务提供商。
要注册您的服务提供者,您只需在config/app.php
文件中的服务提供者数组中添加一个条目。
'providers' => [
/*
* Laravel Framework Service Providers...
*/
...
YourPackage\Namespace\PackageServiceProvider::class,
],
现在希望你的包成功加载到你的 laravel 项目中。
【讨论】:
以上是关于Composer、Laravel 和本地包的主要内容,如果未能解决你的问题,请参考以下文章
应该如何为 laravel 4 composer 包设置 git 子模块?