从 Laravel 中包含的包中发布配置和迁移

问题描述 投票:0回答:9

我正在使用 Laravel 构建一个包,其中将包含一些管理功能,并将包含一些其他包。

我已经包含了一个包含迁移和配置文件的包,但是如何将它们复制到 Laravel 中的正确文件夹中。该包有它自己的 ServiceProvider 但我如何从我的包中调用它?

我正在使用以下命令在我的包中注册该包。

class CldServiceProvider extends ServiceProvider {

    public function register()
    {
       $this->app->register(MediaLibraryServiceProvider::class);
    }
}

我已经尝试过了

php artisan vendor:publish 

但它说没有什么可发布的。因为它只查看此 Laravel 安装的包,而不是嵌套的包。

php laravel package
9个回答
5
投票

就我而言,我发现我需要将我的包包含在我正在处理的应用程序中。我遵循的原始教程中没有包含此步骤。

所以在主应用程序的

composer.json
中:

"repositories": [
    {
        "type": "path",
        "url": "packages/namespace/name",
        "options": {
            "symlink": true
        }
    }
],
"require": {
    // ...
    "namespace/name": "dev-master"
},

然后我们从主文件夹运行此命令:

composer update

之后运行

php artisan vendor:publish
将包含发布子包的选项。

注意:此信息的来源是:https://laraveldaily.com/how-to-create-a-laravel-5-package-in-10-easy-steps/


4
投票

在包根文件夹中创建

database/migrations
文件夹。然后在服务提供商的启动方法中添加发布详细信息。

final class MyPackageServiceProvider extends BaseServiceProvider
{
    public function boot(): void
    {
        $this->publishes([
            __DIR__ . '/../database/migrations/' => database_path('migrations/my-package'),
        ], 'my-package-migrations');
    }
}

第二部分可能类似于

database_path('migrations')
database_path('migrations/my-package')
。我建议与子文件夹一起使用,因为如果有很多包
migrations
文件夹会增长太多。

'my-package-migrations'
部分是我们的标签。并运行带标签的发布命令。

php artisan vendor:publish --tag=my-package-migrations

如果您使用子文件夹

php artisan migrate
命令将不起作用,因为我们需要像这样指定精确的迁移文件夹,

php artisan migrate --path=/database/migrations/my-package

是的,这看起来有点脏,但可以整理电缆。并且不要忘记使用

composer dump-autoload
。如果服务提供商已注册,则此解决方案有效。另外,您可以使用此方法进行配置,但配置文件夹不支持子文件夹。


3
投票

尝试单独发布配置并使用强制开关

php artisan vendor:publish --tag=config --force

2
投票

正如 @scrubmx 提到的,您需要包含定义可以发布内容的代码,尽管此代码实际上不应该位于您自己的服务提供商中,而应该位于您所包含的其他包中。如果它似乎没有此代码,最好将其列为该包存储库中的问题或创建拉取请求来添加它。


1
投票

发布供应商迁移:

php artisan vendor:publish --tag=migration

发布供应商配置:

php artisan vendor:publish --tag=config

0
投票

我想你已经自己发布了配置文件

$this->publishes([
    'other-package/absolute/path/some-config.php' => config_path('my-package.php'),
]);

0
投票

解决方案

我将 /packages/ 文件夹包含在我当前正在处理的项目中。 问题是当我的composer.json中包含包时

现在可以从我的项目内的两个位置访问它,即供应商文件夹和我的包文件夹中。这导致了问题

我将包移到当前项目之外,这解决了问题。


0
投票

你已经运行了这段代码,这段代码必须写在 boot 方法中。

// run dependency publishable
$this->publishes(self::pathsToPublish(MediaLibraryServiceProvider::class), 'sample-group');

可以看这个包中boot函数写的例子


0
投票

对于 laravel 11 ,配置发布

Laravel 的大部分配置文件已经发布在您的 应用程序的配置目录;但是,某些配置文件 像 cors.php 和 view.php 默认情况下不发布,因为大多数 应用程序永远不需要修改它们。

但是,您可以使用 config:publish Artisan 命令来发布任何内容 默认不发布的配置文件:

php artisan config:publish
 
php artisan config:publish --all
© www.soinside.com 2019 - 2024. All rights reserved.