繁体   English   中英

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

[英]Safely edit a third party composer (vendor) package in Laravel & prevent losing customized changes on release of a new version of the package

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

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

  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"
},

然后将其添加到自动加载

"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

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

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

我在这里使用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))
        );
    }
}

如果您想要更改某个类的包,则必须这样做

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

  2. 创建一个服务提供程序,扩展该类的服务提供程序并更改registerBinding类以绑定您的扩展类

  3. 将新服务提供providers放在config\\app中的providers数组中

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

     "extra": { "laravel": { "dont-discover": [ "barryvdh/laravel-debugbar" ] } }, 

如果你想保留你的更改并同时从原始仓库更新包,你可以分叉这个包并指向composer来从你的fork,而不是原始的repo。

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

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

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

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

另外,请注意dev-自动添加,因此分支名称是错误bugfix而不是dev-bugfix 如果你将你的分支命名为dev-bugfix你将需要它作为dev-dev-bugfix

  1. 使用供应商软件包的严格版本,例如代替“vendor / package”:“~1.3”或“vendor / package”:“^ 1.3.2”,您可以使用“vendor / package”:“1.3.2” ,
  2. 将修改后的源文件复制到公共(如果是开源),或私有文件的存储/应用程序(例如laravel)
  3. 只需在Controller中编写代码:File :: copy('foldername / filename.php','.. / enndor / namevendor / spamfolwwhatever / filename.php');
  4. 将此作为部署例程,与部署同事共享
  5. 喝咖啡,有生命,做完

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM