laravel Composer不自动加载自定义包

sr4lhrrt  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(131)

确认:首先,这是我的第一篇求助文章,因为我看了很多关于stackoverflow和其他资源的文章,但就是找不到解决方案。

问题听起来很熟悉,但我就是想不出来,也许是因为我坚持了2天。另一个注意,这是我的第一个包,所以是的,我不是100%确定我在做什么。

结构:

- laravel-project 
    - ...
    - packages
        - my-custom-package
            - src
                - MyCustomPackageServiceProvider.php
            - composer.json
    - public
    - resources
    - routes
    - ...
    - composer.json

因此,它是基本的Laravel 5.8 +内部添加的包文件夹,用于本地包开发(它已被移动到仓库以及)
现行规范(简化为其实际工作项目):

**文件:**laravel-project/packages/my-custom-package/composer.json

{
    "name": "company/my-custom-package",
    "type": "library",
    "require": {
        "php": ">=7.2",
    },
    "require-dev": {
        "ext-curl": "*"
    },
    "authors": [
        {
            "name": "John Smith",
            "email": "jsmith@test.tv"
        }
    ],
    "autoload" : {
        "prs-4": {
            "Company\\MyCustomPackage\\": "src/"
        }
    },
    "minimum-stability": "dev"
}

**文件:**laravel-project/packages/my-custom-package/src/MyCustomPackageServiceProvider.php

<?php

namespace Company\MyCustomPackage;

use Illuminate\Support\ServiceProvider;

class MyCustomPackageServiceProvider extends ServiceProvider {

    public function boot()
    {
        $this->loadRoutesFrom(__DIR__ . '/routes/web.php');
        $this->loadMigrationsFrom(__DIR__ . '/database/migrations');
    }

    public function register()
    {

    }

}

**文件:**laravel-project/composer.json

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "repositories": [
        {
            "type": "path",
            "url": "~/testlaravel/packages/my-custom-package",
            "options": {
                "symlink": true
            }
        }
    ],
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.8.*",
        "laravel/tinker": "^1.0",
        "guzzlehttp/guzzle": "^6.3.3",
        "company/my-custom-package": "dev-master"
    },
    "require-dev": {
        "beyondcode/laravel-dump-server": "^1.0",
        "filp/whoops": "^2.0",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^7.5"
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories"
        ]
    },
    "autoload-dev": {
        "prs-4": {
            "Company\\MyCustomPackage\\": "~/testlaravel/packages/my-custom-package/src"
        }
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    }
}

解释:~/testlaravel/是Vagrant机器中的文件夹路径,项目的原始URL是“packages/my-custom-package”,但我为这个扩展版本做了更改,只是为了让它工作。
**文件:**config/app.php(新增服务商)

Company\MyCustomPackage\MyCustomPackageServiceProvider::class

问题:首先,我做了这个东西localy和它的工作,我是从以下快速安装说明“* 创建Laravel Composer软件包从头上传到packagist*”作者:Bitfumes,和包工作,我可以运行 composer 更新,然后我添加到app.php我的包,我可以运行自定义路由,这一切都工作.之后我把包移到了git repo中,并以同样的方式要求它,只是把“repositories”字段改为

"repositories": [
        {
            "type": "vcs",
            "url": "git@git.fulllink.co:john/my-custom-package.git"
        }
    ]

当你运行composer update时,你可以看到在vendor/ files里面有一个包含包的Company文件夹,但是如果你离开config/app.php服务提供程序,它会开始抱怨有*Class 'Company\MyCustomPackage\MyCustomPackageServiceProvider' not fo und*
经过一些f***左右,我发现是的,我的autoload_classmap(不记得原来的帖子)不包含我的包,所以今天我决定再试一次本地,看看区别,它是否被添加到Map文件,现在我得到同样的错误时,需要本地包,我不能让它工作了。
我一直在删除供应商文件夹和锁定文件, composer 转储自动加载,但这没有帮助。我只是在想还有什么东西被超级缓存了吗?

**!!更新!!”””我甚至没有更多的困惑。在composer.json中(我现在在实际的项目仓库上测试了项目一,其中需要另外2个本地git仓库)。所以我现在在vendor/Company/{4 packages}中有4个包,我比较了所有4个包composer.json,我找不到任何主要差异,但除了我的,所有这些包都已加载到自动加载Map。我能看到的唯一主要区别是,这两个软件包不使用ServiceProvider.php文件,但我看不出这会如何影响或改变事情。

42fyovps

42fyovps1#

你做了90%的正确工作,所以这里有一个简洁的答案,任何人谁是面临这个问题,我刚刚测试了这个与Laravel 8.8,但我相信它将工作与Laravel v10以及。

️1第一步

在Laravel项目的root composer.json中有以下2个更改。
1.需要像这样的自定义库:
"company/my-custom-package": "dev-main"如果你使用的是传统的默认git分支命名,那么使用dev-master
1.将存储库添加到同一文件的末尾,如下所示:

"repositories": [
    {
        "type": "path",
        "url": "packages/my-custom-package/",
        "options": {
            "symlink": true
        }
    }
]

其中packages是位于根目录composer.json旁边的目录。

️2第二步

现在,在您的自定义包中,假设packages/my-custom-package/composer.json确保具有这两个明显的配置。
1.自动加载,达!SP所在的目录

"autoload": {
     "psr-4": {
         "Company\\MyCustomPackage\\": "src/"
     }
 },

1.现在是“extras”,这样我们就可以让Laravel自动发现我们的软件包了,对吧?

"extra": {
    "laravel": {
        "providers": [
            "Company\\MyCustomPackage\\FooServiceProvider"
        ],
        "aliases": {
            "Foo": "Company\\MyCustomPackage\\FooFacade"
        }
    }
},

相关问题