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

rjzwgtxy  于 2023-05-05  发布在  PHP
关注(0)|答案(8)|浏览(151)

我正在使用Laravel构建一个包,它将包括一些管理功能,并将包括一些其他包。
我已经包含了一个包含迁移和配置文件的软件包,但是我如何将它们复制到Laravel中的正确文件夹中。这个包有它自己的ServiceProvider,但是我如何从我的包中调用它呢?
我正在使用下面的命令注册我的包中的包。

class CldServiceProvider extends ServiceProvider {

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

我试过了

php artisan vendor:publish

但上面说没什么可发表的。因为它只查看这个Laravel安装的包,而不是嵌套的包。

mlnl4t2r

mlnl4t2r1#

在我的例子中,我发现我需要在我正在处理的应用程序中包含我的包。我遵循的原始教程中没有包含此步骤。
在主应用程序中的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/

wwodge7n

wwodge7n2#

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

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

rkkpypqq3#

正如@scrubmx所提到的,您需要包含定义可以发布的内容的代码,尽管这些代码不应该在您自己的服务提供程序中,而是在您包含的其他包中。如果它似乎没有这个代码,最好将其列为该软件包的存储库中的问题,或者创建一个pull请求来添加它。

lx0bsm1f

lx0bsm1f4#

在包根文件夹中创建database/migrations文件夹。然后在服务提供商的 Boot 方法中添加发布详细信息。

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。如果服务提供商已注册,则此解决方案有效。此外,您可以使用此方法进行配置,但配置文件夹不支持子文件夹。

11dmarpk

11dmarpk5#

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

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

v9tzhpje6#

解决方案

我将/packages/文件夹包含在我正在处理的当前项目中。问题是,在我的composer.json中包含包时
现在可以从我的项目中的两个地方访问它,在vendor文件夹和我的packages文件夹中。这引起了
我把我的包移到了当前项目之外,这解决了这个问题。

f5emj3cl

f5emj3cl7#

发布供应商迁移:

php artisan vendor:publish --tag=migration

发布供应商配置:

php artisan vendor:publish --tag=config
gstyhher

gstyhher8#

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

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

您可以转到在 Boot 函数in this package中编写的示例

相关问题