【问题标题】:Laravel 4 package from private repository: ServiceProvider not found来自私有存储库的 Laravel 4 包:未找到 ServiceProvider
【发布时间】:2013-10-05 11:06:49
【问题描述】:

我为 Laravel 4 创建了一个包,该包在 workbench 中用于开发时可以正常工作,但是当我使用 Composer 安装它时,它一直返回错误 Class 'Myvendor\Mypackage\MypackageServiceProvider' not found

我的包有一个特殊性,那就是我的类源的名称与我的包的名称不同。通常它们是相同的。

vendor/
    Houle/
        laravel-dynamite/
            src/
                Fhoule/
                    Dynamite/
                        DynamiteServiceProvider.php

我知道它可以工作,因为 Laravel 也是这样工作的。

vendor/
    laravel/
        framework/
            src/
                Illuminate/

我的包 composer.json 的属性 PSR-0 似乎配置正确:

"name": "Houle/laravel-dynamite",
...
"require": {
    "php": ">=5.3.0",
    "illuminate/support": "4.0.x"
},
"autoload": {
    "classmap": [
        "src/migrations",
        "src/controllers",
        "src/models"
    ],
    "psr-0": {
        "Fhoule\\Dynamite": "src/"
    }
},
...

我是如何创建我的包的:

  • 使用 Artisan 创建包。
  • 使其在工作台目录中正常工作
  • 推送到私有 Bitbucket 存储库
  • 安装了新的 Laravel 实例
  • 更改了 composer.json 配置以安装我的包(来自私有存储库)

    "name": "laravel/laravel",
    ...
    "require": {
        "laravel/framework": "4.0.*",
        "Houle/laravel-dynamite": "2.0.1"
    },  
    "repositories": [{
        "type": "package",
        "package": {
            "name": "Houle/laravel-dynamite",
            "version": "2.0.1",
            "source": {
                "url": "git@bitbucket.org:Houle/laravel-dynamite.git",
                "type": "git",              
                "reference": "v2.0.1"
            }
        }
    }],
    ...
    
  • 将我的包Service Provider添加到app/config/app.php:

    'providers' => array(
        'Fhoule\Dynamite\DynamiteServiceProvider',
    )
    

这就是我的应用程序返回错误 Class 'Fhoule\Dynamite\DynamiteServiceProvider' not found 的地方。

我的问题可能是什么?

【问题讨论】:

  • 你跑php artisan dump-autoload了吗?
  • 执行composer installupdate后就不需要了,但是我试过了。
  • 好的,但实际上,如果您使用的是工作台,则有必要运行 artisan 的 dump-autoload,因为它比 composer dump-autoload 做得更多。

标签: laravel laravel-4 composer-php


【解决方案1】:

我发现了我的问题,这与我命名供应商、包和类的方式无关。

在我的composer.json(项目的根目录)中,我将存储库类型设置为package,但就像 Composer 文档所述类型package 用于不支持 Composer 的包。这就是 Composer 没有更新我的 autoload_classmap.php 文件的原因。

因此,如果您想使用 private repository(例如在 Bitbucket 或 GitHub 上),您需要将存储库的类型设置为 git

{
    "name": "laravel/laravel",
    ...
    "require": {
        "laravel/framework": "4.0.*",
        "houle/laravel-dynamite": "dev-master"
    },  
    "repositories": [{
        "type": "git",
        "url": "git@bitbucket.org:Houle/laravel-dynamite.git"       
    }],
    ...
}

希望对某人有所帮助。

【讨论】:

    【解决方案2】:

    你的包中的composer.json(在BitBucket中找到的包)需要指定PSR-0自动加载组件,而不是你的顶级Laravel项目中的composer.json文件。

    您能否向我们展示您在私有存储库中的 repo 的 composer.json 文件?

    【讨论】:

    • 我的包composer.json的内容是我在问题中输入的第一个代码sn-p。
    猜你喜欢
    • 2018-04-24
    • 2016-07-18
    • 1970-01-01
    • 2023-04-01
    • 2017-11-18
    • 2018-11-25
    • 2016-08-27
    • 1970-01-01
    • 2021-06-18
    相关资源
    最近更新 更多