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

Tim*_*ktu 8 php laravel composer-php laravel-5

我想编辑我在Laravel 5项目中从作曲家中提取的一个包,但是我相信如果我跑了composer update并且已经发布了这个包的新版本,我将失去所有的更改.我该如何编辑包?有没有办法将包从供应商目录中复制出来,以便我可以在项目的其他地方使用它?

Mor*_*abi 13

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

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

首先从require中删除它

"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"
},
Run Code Online (Sandbox Code Playgroud)

然后将其添加到自动加载

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Collective\\Html\\": "packages/laravelcollective/html/src", <==== add this line
    },
}
Run Code Online (Sandbox Code Playgroud)

请不要忘记跑步

composer dumpauto
Run Code Online (Sandbox Code Playgroud)


who*_*boy 8

出于您指出的原因,编辑作曲家包实际上并不安全。

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

我在这里用 Filesystem 类完成了它。它不能确保它不会中断,但它确实可以让您在不覆盖更改的情况下进行更新。

配置/app.php

<?php

return [

    'providers' => [

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

    'aliases' => [
        ...
    ],

];
Run Code Online (Sandbox Code Playgroud)

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))
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我通常分叉存储库并在存储库部分下的我的 composer.json 文件中引用我的分叉存储库。缺点是当所述软件包更新时,您将无法获得更新。 (2认同)