从 Laravel 中包含的包发布配置和迁移
Publishing config and migrations from included package in Laravel
我正在使用 Laravel 构建一个包,其中将包含一些管理功能并将包含一些其他包。
我已经包含了一个包含迁移和配置文件的包,但是如何将它们复制到 Laravel 中的正确文件夹中?该包有自己的 ServiceProvider,但我如何从我的包中调用它?
我正在使用以下方法在我的包中注册包。
class CldServiceProvider extends ServiceProvider {
public function register()
{
$this->app->register(MediaLibraryServiceProvider::class);
}
}
我试过了
php artisan vendor:publish
但是它说没有什么可以发布的。因为它只查看此 Laravel 安装的包,而不是嵌套的包。
我想你已经自己发布了配置文件
$this->publishes([
'other-package/absolute/path/some-config.php' => config_path('my-package.php'),
]);
尝试单独发布配置并使用强制开关
php artisan vendor:publish --tag=config --force
正如@scrubmx 提到的,您需要包含定义可以发布的内容的代码,尽管该代码实际上不应包含在您自己的服务提供商中,而是包含在您包含的其他包中。如果它似乎没有此代码,最好将其列为该软件包存储库中的问题或创建拉取请求以添加它。
解决方案
我将 /packages/ 文件夹包含在我正在处理的当前项目中。
问题是在我的 composer.json
中包含包时
It is now reachable from 2 places inside my project, in the vendor folder and in my packages folder. This was causing issue's
我将包移到了当前项目之外,这解决了问题。
就我而言,我发现我需要在我正在处理的应用程序中包含我的包。我遵循的原始教程中没有包含此步骤。
因此在 composer.json
主应用程序中:
"repositories": [
{
"type": "path",
"url": "packages/namespace/name",
"options": {
"symlink": true
}
}
],
"require": {
// ...
"namespace/name": "dev-master"
},
然后我们 运行 来自主文件夹的命令:
composer update
之后 运行ning php artisan vendor:publish
将包含发布子包的选项。
注意:此信息的来源是:https://laraveldaily.com/how-to-create-a-laravel-5-package-in-10-easy-steps/
发布供应商迁移:
php artisan vendor:publish --tag=migration
发布供应商配置:
php artisan vendor:publish --tag=config
在包根文件夹中创建 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
。如果服务提供商已注册,则此解决方案有效。另外,您可以使用此方法进行配置,但配置文件夹不支持子文件夹。
我正在使用 Laravel 构建一个包,其中将包含一些管理功能并将包含一些其他包。
我已经包含了一个包含迁移和配置文件的包,但是如何将它们复制到 Laravel 中的正确文件夹中?该包有自己的 ServiceProvider,但我如何从我的包中调用它?
我正在使用以下方法在我的包中注册包。
class CldServiceProvider extends ServiceProvider {
public function register()
{
$this->app->register(MediaLibraryServiceProvider::class);
}
}
我试过了
php artisan vendor:publish
但是它说没有什么可以发布的。因为它只查看此 Laravel 安装的包,而不是嵌套的包。
我想你已经自己发布了配置文件
$this->publishes([
'other-package/absolute/path/some-config.php' => config_path('my-package.php'),
]);
尝试单独发布配置并使用强制开关
php artisan vendor:publish --tag=config --force
正如@scrubmx 提到的,您需要包含定义可以发布的内容的代码,尽管该代码实际上不应包含在您自己的服务提供商中,而是包含在您包含的其他包中。如果它似乎没有此代码,最好将其列为该软件包存储库中的问题或创建拉取请求以添加它。
解决方案
我将 /packages/ 文件夹包含在我正在处理的当前项目中。 问题是在我的 composer.json
中包含包时It is now reachable from 2 places inside my project, in the vendor folder and in my packages folder. This was causing issue's
我将包移到了当前项目之外,这解决了问题。
就我而言,我发现我需要在我正在处理的应用程序中包含我的包。我遵循的原始教程中没有包含此步骤。
因此在 composer.json
主应用程序中:
"repositories": [
{
"type": "path",
"url": "packages/namespace/name",
"options": {
"symlink": true
}
}
],
"require": {
// ...
"namespace/name": "dev-master"
},
然后我们 运行 来自主文件夹的命令:
composer update
之后 运行ning php artisan vendor:publish
将包含发布子包的选项。
注意:此信息的来源是:https://laraveldaily.com/how-to-create-a-laravel-5-package-in-10-easy-steps/
发布供应商迁移:
php artisan vendor:publish --tag=migration
发布供应商配置:
php artisan vendor:publish --tag=config
在包根文件夹中创建 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
。如果服务提供商已注册,则此解决方案有效。另外,您可以使用此方法进行配置,但配置文件夹不支持子文件夹。