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

时间:2015-06-26 19:23:20

标签: php laravel laravel-5 composer-php

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

5 个答案:

答案 0 :(得分:13)

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

  1. 在Laravel根目录中创建一个目录,并将其命名为包或任何您喜欢的目录。
  2. 将修改后的软件包从vendor目录移动到您的packages目录。
  3. 更新composer.json以从packages目录而不是vendor目录加载包。
  4. 首先将其从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"
    },
    

    然后将其添加到自动加载

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

    请不要忘记运行

    composer dumpauto
    

    替代第3步。

    如果您使用的是最新版本的作曲家,还有一种新选择。

    将此添加到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
    

答案 1 :(得分:3)

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

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

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

<强>配置/ app.php

<?php

return [

    'providers' => [

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

    'aliases' => [
        ...
    ],

];

<强> MyApp的\文件系统\ 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))
        );
    }
}

答案 2 :(得分:1)

如果要更改软件包的类,则必须

  1. 创建一个扩展包类并进行更改的类

  2. 创建一个扩展该类的服务提供者的服务提供者,并更改$configArray = [ 'client_id' => 'foo', 'client_secret' => 'bar' ]; $client = new Google_Client($configArray); 类以绑定您的扩展类

  3. registerBinding的{​​{1}}数组中放置新服务提供商

  4. 禁用此软件包的软件包发现,您可以在应用程序的composer.json文件的附加部分中列出软件包名称:

    providers

答案 3 :(得分:1)

如果您要保留更改并同时从原始存储库更新软件包,则可以分叉此软件包并指向作曲家从您的存储库中拉出,而不是原始存储库。

  

您要做的就是将fork添加为存储库并更新   版本约束以指向您的自定义分支。您的自定义分支   名称必须带有dev-前缀。

如下更新您的composer.json文件:

{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/MyGithub/html"
        }
    ],
    "require": {
        "laravelcollective/html": "dev-bugfix"
    }
}

请注意,除了指定bugfix分支外,您无需更改require语句。您仍然引用上游包(laravelcollective / html),而不是您的个人fork(MyGithub / html)。

还请注意,dev-是自动添加的,因此分支名称是bugfix而不是dev-bugfix。如果您将分支命名为dev-bugfix,则将其命名为dev-dev-bugfix

答案 4 :(得分:-3)

  1. 使用供应商软件包的严格版本,例如可以使用“供应商/包装”:“ 1.3.2”代替
  2. ,而不是“ vendor / package”:“〜1.3”或“ vendor / package”:“ ^ 1.3.2”
  3. 将修改后的源文件复制到公共文件中(如果是开源的话),或将存储/应用程序复制到私有文件中(例如laravel)
  4. 在Controller中简单地编写代码:File :: copy('foldername / filename.php','../ vendor / namevendor / subfolderwhatever / filename.php');
  5. 将其作为部署例程,共享给部署同事
  6. 喝咖啡,生活,做完