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



我想编辑我在Laravel 5项目中从composer那里提取的一个包,但我相信如果我运行composer update并且发布了这个包的新版本,我将丢失所有更改。我应该如何编辑程序包?有没有一种方法可以将包从供应商目录中复制出来,这样我就可以在项目的其他地方使用它?

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

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

首先将其从要求中删除

"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

编辑composer包实际上并不安全,这正是您指出的原因。

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

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

config/app.php

<?php
return [
    'providers' => [
//        'IlluminateFilesystemFilesystemServiceProvider',
        'MyAppFilesystemFilesystemServiceProvider',
    ],
    'aliases' => [
        ...
    ],
];

MyApp\Filesystem\FilesystemServiceProvider.php

<?php namespace MyAppFilesystem;
use Config;
use Storage;
use LeagueFlysystemFilesystem;
use DropboxClient as DropboxClient;
use LeagueFlysystemDropboxDropboxAdapter;
use IlluminateFilesystemFilesystemManager 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))
        );
    }
}

如果您想保留您的更改并同时从原始repo更新包,您可以从您的fork(而不是原始repo)派生此包并指向composer。

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

按如下方式更新composer.json文件:

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

请注意,除了指定错误修复分支外,您不会更改require语句。您仍然引用上游包(laravelcollective.html),而不是您的个人分叉(MyGithub.html)。

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

如果你想更改包的类,你必须进行

  1. 创建一个扩展包类的类,并使您的更改

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

  3. 将该新服务提供商放入configapp 中的providers阵列中

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

    "extra": {
        "laravel": {
            "dont-discover": [
                "barryvdh/laravel-debugbar"
            ]
        }
    }, 
    
  1. 使用供应商包的严格版本,例如,您可以使用"供应商/包":"1.3.2",而不是"供应商/包包":"~1.3"或"供应商/包裹":"^1.3.2"
  2. 将修改后的源文件复制到公共文件(如果是开源的),或将存储/应用程序复制到私人文件(例如laravel)
  3. 只需在Controller:File::copy('oldername/filenname.php','../vendor/namevendor/subfolderhatever/filename.php')中进行编码
  4. 将其作为部署例程,共享给部署同事
  5. 喝杯咖啡,享受生活,结束

相关内容

  • 没有找到相关文章

最新更新