我想编辑我在Laravel 5项目中从composer那里提取的一个包,但我相信如果我运行composer update
并且发布了这个包的新版本,我将丢失所有更改。我应该如何编辑程序包?有没有一种方法可以将包从供应商目录中复制出来,这样我就可以在项目的其他地方使用它?
简单、快速、安全的方法:
- 在Laravel的根目录中创建一个目录,并将其命名为packages或任何您喜欢的名称
- 将修改后的程序包从供应商目录移动到您的程序包目录
- 更新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
。
如果你想更改包的类,你必须进行
-
创建一个扩展包类的类,并使您的更改
-
创建一个扩展类的服务提供者的服务提供者,并更改
registerBinding
类以绑定扩展类 -
将该新服务提供商放入
configapp
中的providers
阵列中 -
禁用此包的包发现,您可以在应用程序的composer.json文件的额外部分中列出包名称:
"extra": { "laravel": { "dont-discover": [ "barryvdh/laravel-debugbar" ] } },
- 使用供应商包的严格版本,例如,您可以使用"供应商/包":"1.3.2",而不是"供应商/包包":"~1.3"或"供应商/包裹":"^1.3.2"
- 将修改后的源文件复制到公共文件(如果是开源的),或将存储/应用程序复制到私人文件(例如laravel)
- 只需在Controller:File::copy('oldername/filenname.php','../vendor/namevendor/subfolderhatever/filename.php')中进行编码
- 将其作为部署例程,共享给部署同事
- 喝杯咖啡,享受生活,结束