在Laravel中安全地编辑第三方作曲家(供应商)软件包,并防止在发布新版本的软件包时丢失自定义更改

2022-08-30 17:09:14

我想在我的Laravel 5项目中编辑我从作曲家那里提取的软件包,但是我相信如果我运行并且发布了这个软件包的新版本,我将丢失所有更改。我应该如何编辑包?有没有办法将包从供应商目录中复制出来,以便我可以在项目中的其他位置使用它?composer update


答案 1

简单、快速、安全的方法:

  1. 在Laravel的根目录中创建一个目录,并将其命名为软件包或任何您喜欢的名称。
  2. 将修改后的包从供应商目录移动到包目录。
  3. 更新 composer.json 以从包目录(而不是供应商目录)加载包。

首先将其从“需要”中删除

"require": {
    "php": ">=5.6.4",
    "laravel/framework": "5.3.*",
    "laravelcollective/html": "^5.3.0", <==== remove this line                           
    "barryvdh/laravel-debugbar": "^2.3",
    "doctrine/dbal": "^2.5"
},

然后将其添加到自动加载

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Collective\\Html\\": "packages/laravelcollective/html/src", <==== add this line
    },
}

请不要忘记跑步

composer dumpauto

步骤 3 的替代方法。

如果您使用的是最新版本的 Composer,则还有一个新的替代方案。

将此添加到 composer.json

"repositories": [
    {
        "type": "path",
        "url": "./packages/laravelcollective"
    }
]

然后将包的版本修改为dev-master

"require": {
    "php": ">=5.6.4",
    "laravel/framework": "5.3.*",
    "laravelcollective/html": "dev-master", <==== this line                           
    "barryvdh/laravel-debugbar": "^2.3",
    "doctrine/dbal": "^2.5"
},

最后

composer update

答案 2

实际上,编辑作曲家包是不安全的,原因正是你所指出的。

我所做的是扩展我想要/需要更改的类。

我在这里用文件系统类完成了它。它不能确保它不会中断,但它确实允许您在不覆盖更改的情况下进行更新。

配置/应用.php

<?php

return [

    'providers' => [

//        'Illuminate\Filesystem\FilesystemServiceProvider',
        'MyApp\Filesystem\FilesystemServiceProvider',
    ],

    'aliases' => [
        ...
    ],

];

MyApp\Filesystem\FilesystemServiceProvider.php

<?php namespace MyApp\Filesystem;

use Config;
use Storage;
use League\Flysystem\Filesystem;
use Dropbox\Client as DropboxClient;
use League\Flysystem\Dropbox\DropboxAdapter;
use Illuminate\Filesystem\FilesystemManager as LaravelFilesystemManager;

class FilesystemManager extends LaravelFilesystemManager{

    public function createDropboxDriver(array $config)
    {
        $client = new DropboxClient($config['token'], $config['app']);

        return $this->adapt(
            new Filesystem(new DropboxAdapter($client))
        );
    }
}

推荐