我的问题是我有一个不是存储库的软件包,我试图让它与Laravel和作曲家玩得很好。它仍然位于供应商文件夹下,唯一的问题是,如果我只是设置:
"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文件夹中或为此包创建一个存储库。
答案 0 :(得分:12)
如果您有一些类正在调用“package”,那么您不应该将这些文件添加到您的供应商文件夹中。此文件夹由作曲家管理,您可以随时松开它。在您的应用程序中创建一个子文件夹并将这些文件放在那里。
您必须确保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/"
}
],
答案 1 :(得分:2)
虽然@Antonio Carlos Ribeiro的答案非常好,但我在本地安装自定义软件包时遇到了问题(在答案的最后部分也有说明)
假设这是我们尝试安装的软件包的目录结构:
D:/test_pack
src/
composer.json
如果您不想将自定义程序包(很可能是您自己开发的)上传到在线存储库,则可以使用以下两种方法之一:
方法I
(您必须为您的软件包指定版本,否则您将收到此错误:在任何版本中都找不到请求的软件包,软件包名称中可能存在拼写错误。)
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)压缩你的包裹(让我们假设zip文件在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"
}
]
}
方法II (我最喜欢的方法,您必须使用git init
然后git add .
和git commit -m "your message"
1}}将您的包目录初始化为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
}
]
}
答案 2 :(得分:1)
对于任何Laravel项目,请加载本地包。它存储在您的计算机中。
在laravel的(项目)composer.json
文件中添加
"autoload": {
"psr-4": {
"YourPackage\\Namespace\\": "./local_Package_path/src"
}
},
并在Laravel Project目录中启动命令
composer dump-autoload
如果您的项目中仍然没有软件包。然后 注册您的包裹的服务提供商。
要注册服务提供商,您只需要在config/app.php
文件中向服务提供商数组添加一个条目即可。
'providers' => [
/*
* Laravel Framework Service Providers...
*/
...
YourPackage\Namespace\PackageServiceProvider::class,
],
现在希望您的软件包已成功加载到laravel项目中。