最新要闻
- 【环球热闻】实拍日本多地暴雪:1.6米高积雪掩埋车辆、14人死亡
- Redmi Buds 4青春版耳机亮相:单耳轻至3.9g 活力4色
- 环球快资讯:《阿凡达2》中的“海怪”:原来真的存在于地球!
- 天天快消息!男生考研分到高中母校被班主任监考:网友一句话扎心
- 天天信息:山东小伙用1个月微缩30倍农村老屋:惟妙惟肖
- 每日播报!2022年优化最差游戏榜单出炉:《巫师3》次世代版上榜
- 世界通讯!能跑虚幻5特效!Centerpiece机械键盘自带CPU+GPU
- 环球滚动:康辉被调侃为“天选打工人”:连上六天班、领带惹眼
- 世界百事通!Redmi K60首款素皮机身揭秘:参照跑车内饰 拟真缝线工艺
- 上海今起对快递外卖每人每天补贴60元 元旦春节补贴150元
- 全球观焦点:15.5小时!阿里云史上最长大规模中断:官方公告四大问题
- 不吃饭光吃补充剂 真的可以避免营养缺乏吗?
- 历时9个月 时速350高铁成功“穿海入城”
- 别再说RTX 4090功耗比A卡高了:4K 120帧仅需150W
- 简讯:权威结果出炉:今年画质最好的游戏有答案了
- 炉石关服前夕:网易同类卡牌游戏《秘境对决》宣布恢复运营
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【新视野】PHP Composer 虚拟依赖包 - 实现按需载入钉钉对应功能模块的 php sdk
难得钉钉官方提供了完整的 api sdk,各种语言的版本的都有,而且 api 覆盖面非常完整。但是,composer 安装下来有大几十兆,这个不符合个人的品味,我想要按需加载。
(资料图片仅供参考)
于是在构思了一两次以后,今天下午开始动手实现。
首要原则,不做手工劳动,人工分包,然后提交到 packagist 仓库,那样后续会有巨大的维护工作量。
基本思路:
- 按固定规则在 package.json 中指定所需依赖的钉钉 sdk 的功能模块名称和版本名称,当然,它们在 packagist 仓库中肯定是不存在的;
- 然后利用 composer 包管理工具的 hook 机制,在恰当的时机比如 install 或 update 实现拦截,匹配这种命名规则的包名,动态虚构相应的自定义“仓库”完成下载动作。
实现以后,可以用来解决很多类似场景的问题。
比如,虚构的依赖包名是这样的:
"require-dev": { "x3d/dingtalk-contact": "1.0" },
x3d/dingtalk- 是前缀标识;contact 是钉钉的 api sdk 模块名;1.0 是这个模块的版本号。
这里涉及几个知识点:
1、钉钉sdk中的模块命名规则;2、composer 的 hook 机制;3、找到能从 github git 仓库中按目录检出代码的方式4、虚构 composer 能支持的“仓库”类型
钉钉的 sdk 在 https://github.com/alibabacloud-sdk-php/dingtalk/tree/master/src 这个目录下,按功能模块+相应接口的版本号拼接的目录,目标是每次只按需下载某个模块的代码,并能在项目本地 被 composer 正常管理。
composer 的 hook 机制,在 官网 找到了简单的说明,但是具体是什么效果不清楚,整个下午花时间最多的就是在一个个的 hook 试,找感觉,看哪些能满足此次的需求。同时,要通过代码熟悉相应的知识点,文档是指望不上的。
最后确定了两种事件是可以的,pre-install-cmd、pre-update-cmd,其它细节可能要跟进使用情况进一步挖掘。
实现的代码比较简单,分两步,先分析出来 require 的虚构包列表,然后为他们添加虚构的代码仓库。
$devReqs = $this->composer->getPackage()->getDevRequires(); foreach ($devReqs as $pkgName => $devReq) { if (substr($pkgName, 0, strlen($this->id)) != $this->id) { continue; } $dtk_mods[$pkgName] = $devReq->getPrettyConstraint(); }
$packages = []; foreach ($dtk_mods as $module => $version) { $packages[] = $this->configByModule($module, $version); } $sdkMirror = [ "type" => "package", "package" => $packages, ]; $repoName = $this->repoName; $this->composer->getConfig()->merge([ "repositories" => [ $repoName => $sdkMirror, ], ]); $repoMgr = $this->composer->getRepositoryManager(); $mirrorRepo = $repoMgr->createRepository("package", $sdkMirror, $repoName); $repoMgr->addRepository($mirrorRepo); /** * @param string $module 格式 x3d/dingtalk-service_group * @param string $version 格式 1.0 * @return array */ protected function configByModule(string $module, string $version) { // 下载对应的 dingtalk 结构代码,放到对应结构; $mod = substr($module, strlen($this->id) + 1); $dir = "{$mod}_" . str_replace(".", "_", $version); $package = [ "name"=> $module, "version" => $version, "source" => [ "url" => $this->mirrorUrl, "type" => "svn", "reference" => "trunk/src/$dir/" ], // "target-dir" => "src/", "autoload" => [ "psr-4" => [ $this->nsPrefix . ucfirst($dir) . "\\" => "src/" ] ] ]; return $package; }
由于国内 Gitee 的努力,很早就支持 svn 协议的兼容方案,而我们这种古早程序员从 cvs 和 svn 时代过来的,自然就联想到 转成 svn 就可以满足需求;因此,在Gitee 上建立一个 镜像仓库就,启用 svn 即可。
出现以下下面提示。其中第一个认证领域是用户的密码,这个可以留空。而用户名是用户在 Gitee 登陆时使用邮箱地址。密码则是用户登陆 Gitee 所使用的密码。一般而言,svn 会加密缓存用户的用户名密码,所以,对仓库的操作只需要第一次输入用户邮箱和密码。
然后是看 composer 如何支持这种非标准的没有 package.json composer 协议配置文件的仓库,所幸,确实是支持的。
它支持一种 type 为 package 的仓库形式,里面指定协议为 svn 就可以进一步指定代码目录,这正是我们需要的。
{ "repositories": [ { "type": "package", "package": { "name": "smarty/smarty", "version": "3.1.7", "dist": { "url": "https://www.smarty.net/files/Smarty-3.1.7.zip", "type": "zip" }, "source": { "url": "http://smarty-php.googlecode.com/svn/", "type": "svn", "reference": "tags/Smarty_3_1_7/distribution/" }, "autoload": { "classmap": ["libs/"] } } } ], "require": { "smarty/smarty": "3.1.*" }}
最后,在实操触发 svn 检出时,发现 svn 会报错,
could not be downloaded, Your configuration does not allow connections to svn://gitee.com/web3d/dingtalk-sdk-php/trunk/src/contact_1_0/. See (https://getcomposer.org/doc/06-config.md#secure-svn-domains) for details.
乖乖的去这个页面上去找,果然有答案。
Defaults to [].
Lists domains which should be trusted/marked as using a secure Subversion/SVN transport.
By default svn:// protocol is seen as insecure and will throw, but you can set this config option to ["example.org"] to allow using svn URLs on that hostname.
This is a better/safer alternative to disabling secure-http altogether.
在 package.json 中加一条规则:
"config": { "secure-svn-domains": ["gitee.com"] },
再试,就可以了。
-
【新视野】PHP Composer 虚拟依赖包 - 实现按需载入钉钉对应功能模块的 php sdk
难得钉钉官方提供了完整的apisdk,各种语言的版本的都有,而且api覆盖面非常完整。但是,composer安装下...
来源: -
全球新动态:Safari浏览器对SVG中的
标签支持不友好,渲染容易错位 在svg中需要写一个markdown编辑器,需要用到<foreignObject>绘制来html,编辑器选择了simplemde。大致ht...
来源: 【新视野】PHP Composer 虚拟依赖包 - 实现按需载入钉钉对应功能模块的 php sdk
全球新动态:Safari浏览器对SVG中的
标签支持不友好,渲染容易错位 【环球热闻】实拍日本多地暴雪:1.6米高积雪掩埋车辆、14人死亡
Redmi Buds 4青春版耳机亮相:单耳轻至3.9g 活力4色
环球快资讯:《阿凡达2》中的“海怪”:原来真的存在于地球!
AcWing241. 楼兰图腾
天天速递!CentOS7配置静态IP
天天快消息!男生考研分到高中母校被班主任监考:网友一句话扎心
天天信息:山东小伙用1个月微缩30倍农村老屋:惟妙惟肖
MAUI新生6.1-Shell导航视觉层次结构
每日播报!2022年优化最差游戏榜单出炉:《巫师3》次世代版上榜
世界通讯!能跑虚幻5特效!Centerpiece机械键盘自带CPU+GPU
环球滚动:康辉被调侃为“天选打工人”:连上六天班、领带惹眼
世界百事通!Redmi K60首款素皮机身揭秘:参照跑车内饰 拟真缝线工艺
上海今起对快递外卖每人每天补贴60元 元旦春节补贴150元
全球观焦点:15.5小时!阿里云史上最长大规模中断:官方公告四大问题
不吃饭光吃补充剂 真的可以避免营养缺乏吗?
历时9个月 时速350高铁成功“穿海入城”
别再说RTX 4090功耗比A卡高了:4K 120帧仅需150W
简讯:权威结果出炉:今年画质最好的游戏有答案了
炉石关服前夕:网易同类卡牌游戏《秘境对决》宣布恢复运营
今日最新!洛谷 P5721 【入门3】循环结构
【pygame游戏】用Python实现一个蔡徐坤大战篮球的小游戏,可还行?【附源码】
环球热议:大货车雪地滑坡 山东小伙神操作“拔草相助”!后续令网友感动
超长寿命TLC闪存 金邦2TB PCIe 4.0硬盘679元:5GB/s速度
热门:再不努力就要归零 2nm工艺成日本半导体最后的机会
教你用JavaScript实现搜索展开
天天新资讯:李斌:创业的没有几个真的是骗子 要多鼓励
AMD 8年真身接连被破 Intel 13代酷睿“开挂“:超频无敌了
【焦点热闻】索尼被质疑虚假宣传:上市两年后 PS5仍不支持8K
中国千年酒文化传承 酒祖杜康白酒大促:礼盒装110两瓶
今日聚焦!李斌再回应蔚来数据泄露:会承担所有责任 哪怕破产也不妥协
环球微动态丨「杂题乱写」AtCoderDP26 题
(二)elasticsearch 源码目录
【新视野】碳纤维纹理后盖!Redmi K60回归硬核设计:刀锋战士理念
速看:无惧严寒!网易严选牛奶绒床品四件套:159元起
新的全国铁路列车运行图实行:石家庄至北京将实现一小时通达
新版以太坊Ethereum库ethersV5.0配合后端Golang1.18实时链接区块链钱包(Metamask/Okc)以及验签操作
环球关注:高速上飞来钢管插进驾驶室:差点害死驾驶员
热消息:联想:小红点会在ThinkPad笔记本上永远存在
天天头条:正式发布前 盒装RTX 4070 Ti线下偷跑:售价感人
天天热资讯!保时捷为Taycan推出全新充电器:充电速度提升一倍 改装费用上万
环球通讯!Epic喜加一!免费送大作《地铁》:下款将是《死亡搁浅》
每日头条!2023考研报告发布:“逆向考研”成亮点!附报告源文
世界快播:锐龙7000系列三款非X型号曝光:价格感受下
囧!日本老师暴打初二男生 因学“左手定则”时比中指
老人故意推倒摩托车损坏被抓:车主回应希望判决不手软 惯犯了
焦点速递!Sentinel的规则
天天热议:一加11下周官宣:安卓性能天花板
MAUI新生5.3-Layout布局类控件难点
国产OS统信UOS家庭版22.0明年1月发布:免费用1年 可与Windows共存
全靠移民硬撑?美国人口增长率仍贴近历史低位
视点!18岁女生因焦虑2个月减25斤:最终瘦成95斤
天天消息!男子无聊送外卖发现2小时挣150:开豪车也干
天天精选!Kubernetes监控手册03-宿主监控实操
今日观点!一路用到安卓17?OPPO将提供4年ColorOS重大更新
环球即时看!同价位罕见!雷军:Redmi K60系列这三款全都上2K直屏
微资讯!“联盟号”发生泄漏:俄罗斯或派遣救援飞船接回机组人员
世界播报:cmake-4
Redmi可穿戴新品公布:手表、耳机全都有
行业最快!红魔8 Pro系列搭载520Hz游戏体感肩键:毫秒级触控响应
《阿凡达2:水之道》国内票房突破6亿:卡梅隆光环褪色 回本太难
每日焦点!终结起火、爆炸困扰!红旗全固态电芯试制完成:10Ah级大容量
27款笔记软件的介绍
全球视点!ts10_使用webpack打包ts文件3
环球今日报丨C#封装GRPC类库及调用简单实例
百事通!Spring IOC官方文档学习笔记(四)之依赖项(下)
【天天报资讯】Web 标准 & W3C 规范
今日热闻!研究人员在柬埔寨发现超级蚊子:对杀虫剂免疫
焦点关注:C++基础3
焦点滚动:惧怕《阿凡达2》 输不起?郭帆回应《流浪地球2》撤档 春节见
播报:Redmi K60全系标配2K柔性屏 专家:国产技术已破局超越
环球即时看!以小博大外小内大,Db数据库SQL优化之小数据驱动大数据
全球快资讯丨最高799元 迪士尼再发布涨价公告:开业以来已涨4次
质感一绝!一加11证件照公布:双曲面屏、流动天阶设计
速递!共计100小时:全球首架C919自12月26日起验证飞行
ts09_使用webpack打包ts文件2
环球热头条丨2022贺岁档票房破10亿!《阿凡达:水之道》5.9亿元能拯救院线吗
曾因“双标”遭网友痛批:好丽友旗舰店发布闭店公告
全球热头条丨AcWing1134/洛谷P1144 最短路计数
WPF开发之Prism详解【内附源码】
不愧是宝马 因机油渗漏:近500台S1000系列摩托车被召回
最新快讯!Codeforces 1097 G Vladislav and a Great Legend 题解 (DP)
焦点日报:肾脏衰竭 球王贝利病情继续恶化:家人开始筹备葬礼
02.关于线程你必须知道的8个问题(上)
当前头条:喜提安卓13!小米平板5/Pro 12.4推送MIUI 14开发版:支持光子引擎
每日热文:SSD/内存白菜价难持续:国产厂商被制裁 三星等大厂减产提价
天天热点!我的2022年个人总结
环球焦点!FreeSWITCH学习笔记:EventSocket
AMD RX7900被吐槽空气卡 溢价千元普遍:国内用户持币等 买它还是4080?
【世界播资讯】小米又一爆款诞生!小米净水器销量破500万台
热推荐:新冠后丧失嗅觉的关键原因找到了 科学家:长期失灵也能恢复
环球通讯!3199元起 爱奇艺奇遇MIX VR一体机发布:4K级3000吋巨幕 支持Steam串流
焦点快播:趁早加满!下轮国内油价上调几成定局
影驰发布全球第三款8GHz DDR5内存:如此"光污染" 绝了
焦点速讯:电解质水到底有没有用?我来告诉你
美国人预期寿命降至25年来最低:三大因素导致一半的死亡
11月智能手机销量出炉:小米大卖340万台 国产第一
天天短讯!多方安全计算(6):MPC中场梳理
云原生时代,18 岁的 NGINX 过时了吗?