macOS下由yarn与npm差异引发的Electron镜像地址读取问题

记录macOS下由yarn与npm差异引发的Electron镜像地址读取问题

写在前面:该问题仅仅出现在Linux和macOS上,Windows上不存在该问题!

初始背景

最近笔者重新拾起了Electron,把最新版Electron的官方文档阅读了一遍。众所周知,Electron作为依赖在安装的时候,其二进制文件下载在国内一直以来都是问题(因为默认会从github上下载),好在现在Electron的官方文档已经写的非常详细了:安装指导 | Electron (electronjs.org),只需要配置一个镜像地址到.npmrc中:

ELECTRON_MIRROR="http://npmmirror.com/mirrors/electron/"

记住这个大写的Key

笔者由于是新的机器,还没有配置改值,所以找到.npmrc文件的配置了上述的镜像后,便开开心心的准备进行项目搭建了。

问题出现

然而,当笔者准备使用yarn执行如下命令的时候,却出了问题:

yarn add -D electron

运行启动以后,在Electron安装的环境一直卡住了很久很久。

010-electron-install-pending

咦,难道镜像配置写错了吗?仔细对比以后,没有问题。难道因为我的网络访问很慢吗?等到访问超时以后,发现一个IP地址超时了,心想国内镜像再怎么也不应该超时,盲猜镜像地址没有生效。于是乎,准备尝试对下载Electron二进制文件的过程进行debug。

问题排查

首先定位到node_module/electron包,能够看到有一段安装后脚本执行命令(postinstall):

020-node_module-electron-scripts

关于postinstall的详细说明:scripts | npm Docs (npmjs.com)

也就是说,node_module/electron本身npm包install完成以后,还会执行其包内的install.js。

定位进入了node_module/electron包下的install.js,该脚本内部主要逻辑是先检查Electron的二进制缓存,如果不存在缓存,则使用来自@electron/get包中提供的downloadArtifact方法从远端下载Electron二进制制品文件。

030-installjs-flow

我们暂时先不看缓存读写的逻辑,着重了解远端下载的逻辑,所以我们进入@electron/get包中的downloadArtifact

040-@electron-get-npm

查看@electron/get包下的index.js内容:

050-@electron-get-core-download-script

前面我们提到,怀疑镜像地址没有生效导致下载超时,所以我们重点关注一下这里通过getArtifactRemoteURL方法得到的url值,

由于每一次这个包都会重新安装,我们不太好调试这个值,所以,我们做一个简单的trick:

  1. 找到这个包的缓存(macOS上的路径为:~/Library/Caches/Yarn/v6/npm-@electron-get-xxxx):

060-@electron-get-cache-location

  1. 找到上述indexjs代码,并添加一段日志打印:

070-modify-cached-@electron-get-indexjs

  1. 准备完毕以后,我们重新在demo项目下执行yarn add -D electron。执行以后,等到超时以后,发现控制台日志打印如下:

080-remote-url-is-github

Why!?为什么这个下载的Electron二进制文件地址依然是github的?于是,我们有必要进一步查看这个URL是如何得到。

继续查看代码,这个url来源于artifact-utils中的getArtifactRemoteURL方法,而这个方法里面关于最终返回的url最重要的部分是下图所示的base的值:

090-@electron-get-artifact-utils-getArtifactRemoteURL

而这个base值来源于mirrorVar这个方法:

100-@electron-get-artifact-utils-mirrorVar

根据上面代码的逻辑,name值为"mirror",options未使用,defaultValue为:

"http://github.com/electron/electron/releases/download/"

也就是说,在后面的逻辑中,如果没有从process.env中找到对应的值,那么就会使用默认的github官方制品地址的值。按照代码逻辑,运行到这个方法的时候,会从process.env中尝试获取:

  1. "NPM_CONFIG_ELECTRON_MIRROR"
  2. "npm_config_electron_mirror"
  3. "npm_package_config_electron_mirror"
  4. "ELECTRON_MIRROR"

环境变量—— 配置 | npm 中文网 (nodejs.cn)

任何以 npm_config_ 开头的环境变量都将被解释为配置参数。 例如,将 npm_config_foo=bar 放入您的环境中会将 foo 配置参数设置为 bar。 任何未赋值的环境配置都将被赋值为 true。 配置值不区分大小写,因此 NPM_CONFIG_FOO=bar 的工作方式相同。 但是,请注意,在 scripts 内部,npm 将设置自己的环境变量,并且 Node 会更喜欢那些小写版本,而不是您可能设置的任何大写版本。 详情见此问题。

请注意,您需要使用下划线而不是破折号,因此 --allow-same-version 将变为 npm_config_allow_same_version=true

此外,如果是配置在npmrc里面的配置,也会在npm/yarn启动的时候被作为环境变量放到process.env中被访问。

那我们在.npmrc中配置的ELECTRON_MIRROR,在process.env中变成了什么呢?通过添加日志打印,我们会看到:

110-ProcessEnv-consolelog

120-ProcessEnv-npm_config_ELECTRON_MIRROR

可以看到,在process.env中,这个键为"npm_config_ELECTRON_MIRROR"npm_config小写,ELECTORN_MIRROR大写)。我们知道,nodejs中object对象的属性值是大小写敏感的!所以,当上面的mirrorVar代码运行,尝试获取process.env中的值的时候,根本找不到了,因为没有"NPM_CONFIG_ELECTRON_MIRROR""npm_config_electron_mirror""npm_package_config_electron_mirror""ELECTRON_MIRROR"这些属性。

然而,如果我们使用npm进行安装的时候:

npm install -D electron

又能够很快安装。Why?!难道npm和yarn下的运行环境有差异吗?为了验证,我们编写一个简单的index.js代码:

console.log("process.env['npm_config_electron_mirror']", process.env['npm_config_electron_mirror']);
console.log("process.env['NPM_CONFIG_ELECTRON_MIRROR']", process.env['NPM_CONFIG_ELECTRON_MIRROR']);
console.log("process.env['npm_config_ELECTRON_MIRROR']", process.env['npm_config_ELECTRON_MIRROR']);

然后,在package.json中添加脚本:

{
  "name": "simple-electron-main-app",
  "version": "1.0.0",
  "scripts": {
+   "start": "node index.js"
  },
  "devDependencies": {}
}

最后,我们分别使用yarn(yarn start)和npm(npm run start)来运行脚本:

130-yarn-and-npm-diff

在yarn运行上下文中,.npmrc中的"ELECTRON_MIRROR"直接拼接到了"npm_config_"后边,作为process.env的一个属性,所以你只能访问process.env["npm_config_ELECTRON_MIRROR"]得到值;

在npm运行山下文中,.npmrc中的"ELECTRON_MIRROR"首先被转为了小写,然后拼接到了"npm_config_"后边,作为了process.env的属性,所以你需要访问process.env["npm_config_electron_mirror"]来得到值。

macOS解决方式

终于,我们能解释为什么当我们在.npmrc配置大写的ELECTRON_MIRROR的时候,使用yarn add -D electron安装electron的时候,二进制镜像地址没有生效了。那么,解决的办法也非常简单,两种:

  1. .npmrc配置改为小写key:electron_mirror="http://npmmirror.com/mirrors/electron/"
  2. 使用npm上下文环境进行安装。

个人更加建议按照第一种方式配置,不然大小写敏感的坑太容易发生了。

关于Windows的特别说明

process.env | Node.js API 文档 (nodejs.cn)

在 Windows 操作系统上,环境变量不区分大小写。

const { env } = require('node:process');

env.TEST = 1;
console.log(env.test);
// => 1

也就是说,在Windows机器上,即使process.env中的key为"npm_config_ELECTRON_MIRROR",你也可以通过"npm_config_electron_mirror"或者是"NPM_CONFIG_ELECTRON_MIRROR"来访问这个值:

140-windows-npmrc

150-process-env-Windows-output

本文转载于网络 如有侵权请联系删除

相关文章

  • JeecgBoot 3.3.0 版本发布,基于代码生成器的企业级低代码平台

    项目介绍JeecgBoot是一款企业级的低代码平台!前后端分离架构SpringBoot2.x,SpringCloud,AntDesign&Vue,Mybatis-plus,Shiro,JWT支持微服务。强大的代码生成器让前后端代码一键生成!JeecgBoot引领低代码开发模式(OnlineCoding->代码生成->手工MERGE),帮助解决Java项目70%的重复工作,让开发更多关注业务。既能快速提高效率,节省成本,同时又不失灵活性!当前版本:v3.3.0|2022-07-25源码下载https://github.com/jeecgboot/jeecg-boothttps://gitee.com/jeecg/jeecg-boot技术文档官方网站:http://www.jeecg.com技术文档:http://doc.jeecg.com在线演示:http://boot.jeecg.com新手入门:http://jeecg.com/doc/quickstart升级日志不兼容的升级点:Websocket安全加强,增加token校验、接口签名拦截器的时间戳改造、Syste

  • 京台高铁亮相手机地图,如何跨越台湾海峡引热议

    Alex发自凹非寺 量子位|公众号QbitAI这几天,手机地图可被玩得明明白白——前有台湾省的大街小巷被网友们拿着八倍镜围观,现在又因显示了一条特殊的铁路登上热搜。这条线路就是京台高铁。地图显示,京台高铁起点为北京南站,经天津、沧州等一路向南,直到台北站。在百度地图APP上搜索北京到台北的公共交通,地图还会显示:“直通台北”。这条铁路自然很快收获了一大波关注,不少网友感叹:有生之年!还有人祭出了“意味深长”的表情包:说回京台高铁。这条线路目前还不是完全形态,尚处在建设中。其中,在陆地上修铁路,对于作为“基建狂魔”我国来说简直是小菜一碟;不过大陆和台湾之间还隔了个台湾海峡,所以怎么跨海引发了网友热议。架桥还是修海底隧道?事实上,海峡的宽度、深度,和海底地质地貌等诸多因素都影响着铁路和公路的跨海方式。台湾海峡南宽北窄,南口宽约400km,北口宽约200km,北部最窄处都有130km。这里的大部水深小于80米,平均水深约60米;海峡西北部较平坦,东南部坡度较大,地势比琼州海峡平缓。除了天上飞的,现有的跨海设施主要包括:海底隧道、跨海大桥、轮渡,以及桥、隧、人工岛相连的混搭模式。那么哪种方式适

  • 基于Spring MVC + Spring + MyBatis的【密室逃脱游戏主题排行榜】

    大家好,又见面了,我是你们的朋友全栈君。资源下载: https://download.csdn.net/download/weixin_44893902/25706959 一、语言和环境1.实现语言:Java语言2.环境要求:eclipse/myeclipse/idea、maven、mysql3.使用技术:Spring、SpringMVC、MyBatis、连接池和json包自行选择二、实现功能密室逃脱游戏越来越受年轻人的喜欢,现在将各地密室游戏主题进行排名,评选2021年度最受玩家喜欢的密室主题。说明:下列界面样式仅供参考,实际完成效果美观合理即可。1、显示数据根据图1格式,显示t_games表中所有的数据,并且按照【票数】列进行降序排序,其实【主题种类】一列在t_games表存的是数字,需结合t_gamesType表中对应id值显示出种类文字。每行数据后面有一个投票按钮可向对应主题进行投票。 2、查询数据可根据【主题名称】和【主题类型】进行数据查询。若【主题名称】为空,则按照【主题类型】查询,若【主题名称】不为空,则需要根据【主题名称】进行模糊查询并且也要结合【主题类型】查询。【主题

  • LeetCode-面试题65-不用加减乘除做加法

    #LeetCode-面试题65-不用加减乘除做加法写一个函数,求两个整数之和,要求在函数体内不得使用“+”、“-”、“*”、“/”四则运算符号。示例1:输入:a=1,b=1 输出:2复制限制:a,b均可能是负数或0结果不会溢出32位整数#解题思路不能使用加减乘除,就只能用位运算了按照3步走:不算进位相加计算进位两数相加其中最后一步可以整合到第一步,不算进位相加符合异或逻辑,进位需要两个位置都为1,其余为0,符合与运算。之后左移一位就是进位位置。当进位不为0时,一直计算直到进位为0得到最后数值#Java代码classSolution{ publicintadd(inta,intb){ intsum=0; intcarry=0; do{ sum=a^b;//两数相加,且不考虑进位 carry=(a&b)<<1;//得到进位 a=sum; b=carry; }while(b!=0); returna; } }复制

  • 漫画:什么是IaaS、PaaS、SaaS?

    假如你想要一栋属于自己的房子,你有什么样的选择呢?第一种方式,我们可以自己上山砍树准备木材,然后自己去烧制砖瓦,还需要自己研磨油漆等其他材料.....材料准备齐全以后,我们可以自己打地基,搭建房屋的基础架构,砌墙铺瓦,刷漆装修......经过一系列的统筹规划,直到房屋最终建成。这样搭建房屋的方式,可以用一张图来简单总结:第二种方式,我们可以购买所有建筑所需要的材料,包括木材、砖瓦、油漆等等。材料准备齐全以后,仍然像刚才那样,我们自己打地基,搭建房屋的基础架构,砌墙铺瓦,刷漆装修......经过一系列的统筹规划,直到房屋最终建成。这样搭建房屋的方式,可以用另一张图来简单总结,其中绿色的部分,是我们外包出去的工作,蓝色的部分,是我们自己的工作:第三种方式,我们不仅可以购买所有建筑所需要的材料,还可以雇佣各种工人来完成后续的具体工作。比如我们可以雇佣地基工人打地基,雇佣砖瓦工人砌墙铺瓦,雇佣油漆工刷油漆等等......而我们自己要做的只是统筹规划,直到房屋最终建成。这样搭建房屋的方式,也可以用一张图来简单总结,其中绿色的部分,是我们外包出去的工作,蓝色的部分,是我们自己的工作:第四种方式,我

  • 接口测试平台代码实现2:本平台项目目录解析

    观看了上一节的基础环境和django概念后,本节就来实际看一下项目的各个文件和代码作用吧,大佬请无视。本节主要是进行大致讲解,具体文件作用之后文章会土话细说。先来看下整体结构。(本项目为本地调试项目,并非真实线上项目。所以比较乱,因为是带着很多刚开始学的同事一起做,相当于给大家提供的练手之地,所以难免在很多命名和分层上不是特别合理。但是运行起来和线上项目除了数据不同,其他全是一摸一样。) 首先:Imxiaozhu文件夹:基本都是django创建时候自动生成的。我们只需要在意一下settings.py和urls.py即可。前者为项目的各种基础设置,后者为路由控制器。Xz_ApiTest文件夹:内容较多,初学者我们只需要关注static:静态资源存放,就是你的图片,下载的css/js等等放在这里,之后html中都可以直接调用templates:你的html模版文件存放地,就是写html的地方admin.py:django自带后台的一个主要文件,你想要你做的数据库在后台可见可控,就必须在这个文件中把你的数据库写进去。 models.py:django的orm数据层的主要文件,就是你要创建各种

  • MySQL Case-在线表误删除恢复

    今天晚上业务系统升级,提前跑到表结构中,表需要减字段,在执行dropcolum时报如下错误:登录到服务器上,查看表真的不存在了,只剩下frm文件[root@zjedunode1book]#ls-l|grepzjedu -rw-r-----1mysqlmysql14247Aug1019:48zjedu_cart_3301.frm复制索性,实例并没有关闭[root@centos7test]#ps-ef|grepmysqld root123922322302020pts/400:00:00/bin/sh/usr/local/mysql/bin/mysqld_safe--user=mysql mysql133801239272020pts/400:00:00/usr/local/mysql/bin/mysqld--basedir=/usr/local/mysql--datadir=/data/mysql_data--plugin-dir=/usr/local/mysql/lib/plugin--user=mysql--log-error=error.log--pid-file=/var/run

  • 使用loki和grafana展示ingress-nginx的日志

    在kubernetes中,对于日志的收集,使用最多的是FEK,不过有时候,FEK在架构上会略显重,ES的查询及全文检索功能其实使用的不是很多.LoKi做为日志架构的新面孔,由grafana开源,使用了与Prometheus同样的label理念,同时摒弃了全文检索的能力,因此比较轻便,非常具有潜力。likePrometheus,butforlogsLoki是GrafanaLabs团队最新的开源项目,是一个水平可扩展,高可用性,多租户的日志聚合系统。它的设计非常经济高效且易于操作,因为它不会为日志内容编制索引,而是为每个日志流编制一组标签。项目受Prometheus启发,官方的介绍就是:LikePrometheus,butforlogs,类似于Prometheus的日志系统与其他日志聚合系统相比,Loki具有下面的一些特性:不对日志进行全文索引。通过存储压缩非结构化日志和仅索引元数据,Loki操作起来会更简单,更省成本。通过使用与Prometheus相同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高。特别适合储存KubernetesPod日志;诸如Pod标签之类的元数据会

  • Web安全学习笔记之DES算法实例详解

    转自http://www.hankcs.com/security/des-algorithm-illustrated.html译自J.OrlinGrabbe的名作《DESAlgorithmIllustrated》,国外许多大学将该文章作为补充材料,可作为理解DES算法的最佳入门手册。反观许多教材介绍DES时直接照搬一张流程图,图中IP等缩写符号不加解释,让人误解;许多博客则直接给出蹩脚的源码,对内部流程缺乏解读。事实上,DES在算法上并不复杂,只是流程繁多而已。此时利用一个简单的例子,手工推演一下就能轻松理解。DES(DataEncryptionStandard)算法是世界上最常用的加密算法。在很长时间内,许多人心目中“密码生成”与DES一直是个同义词。尽管最近有个叫ElectronicFrontierFoundation的组织造了台价值22万的机器尝试破解DES加密的数据,DES和它的变种“三重数据加密算法”仍将在政府和银行中广泛应用(译注:本文年代久远,在2001年AES成为了DES的替代品)。DES是怎样工作的?本文将通过一个简单的例子来一步步展示DES的加密流程。自DES诞生以

  • 开发 | 无需后端编码,10 分钟教你实现一个朋友圈小程序

    作者:梁烨鹃这是一篇简易版朋友圈小程序的快速开发教程。要实现的功能有:所有人都可以发布内容。只有发布者可以删除自己发布的内容。所有人都可以看到其他人发布的内容。所有人都可以对内容进行评论。只有发布者可以可以删除评论。所有人都可以看到其他人发表的评论。虽然目标功能的业务逻辑并不复杂,但其背后需要一套靠谱的权限控制系统,也意味着需要一个完整的后端服务系统来支持运行。为了免去搭建、维护后端服务器的麻烦,我们选择使用知晓云(cloud.minapp.com)进行开发。除了因为可以省去后端服务器的开发外,另一个选择它的原因,是它的数据表ACL(Accesscontrollist,访问权限控制)可以实现目标功能的权限控制操作。我们只需要将获取到的数据正确渲染到页面,即可完成目标小程序的开发,十分方便。了解ACL控制系统工欲善其事,必先利其器。在开始小程序开发之前,我们先来了解一下知晓云的ACL控制系统。进入知晓云控制后,点击「应用」,在「数据库」模块里,点击「创建数据库」,就能看到ACL控制面板。在创建数据表时,可以设置该数据表的表录入权限,以及该表中数据行的默认权限。若权限勾选了用户组则必须选择

  • R语言爬虫与文本分析

    之前用python做过简单的爬虫与分析,今天尝试一下用R完成相应的功能。首先用R爬取了《了不起的麦瑟尔夫人》豆瓣短评作为语料,然后进行了词云绘制、关键词提取的基本操作。语料爬取寻找链接 之前在《无问西东》豆瓣短评分析一文中已对豆瓣短评的url做了研究,此处不再赘述。《了不起的麦瑟尔夫人》短评url为:“https://movie.douban.com/subject/26813221/comments?start=0&limit=20&sort=new_score&status=P&percent_type=”,每页显示20条短评,通过改变start参数控制翻页。定位标签使用Chrome开发者工具,发现短评的内容在<divclass="comment">...</div>下的<p>...</p>标签中。代码实现R语言中,有两种进行数据获取的方式。一种是RCurl包+XML包,过程与python中的urllib与bs4相似,先读取网页代码再对html代码进行解析。另一种为rvest包,rv

  • VisualVM通过jstatd方式远程监控远程主机

    配置好权限文件[root@testbin]#cd$JAVA_HOME/bin [root@testbin]#vimjstatd.all.policy grantcodebase"file:${java.home}/../lib/tools.jar"{ permissionjava.security.AllPermission; };复制执行命令启动jstatd-J-Djava.security.policy=jstatd.all.policy复制查看1099端口是否启动:netstat-an|grep1099复制还有一种方式使用xshell直接通过jvisualvm来启动

  • 浅谈小波分析

    小波的发展历史与驱动傅里叶变换短时傅里叶变换小波变换傅里叶变换小波变换三种变换的对比小波变换离散小波变换连续小波变换小波的多分辨率阐述信号空间尺度函数多分辨率分析多分辨率流程其他突变信号与吉布斯效应海森堡不确定原理降维窗口化参考资料本文首先介绍了从傅里叶变换到小波变换的发展史,然后着重强调了小波变换的两种作用——时频分析和多分辨率分析,最后讲了一下吉布斯效应等相关知识。小波的发展历史与驱动傅里叶变换FT(傅里叶变换),通过将信号分解成正余弦函数(把三角函数当做函数空间的基),将时域信号转化为频域信号。缺点是只适用于平稳性信号,在频域图上不能获得对应频率的时间信息。由上图可以看到,对于频域成分相同的信号,即使信号在时域上的分布不一样,FFT变换后的频域图却几乎完全一样。所以说,FFT只可以获得一段信号总体上包含哪些成分,但是对各成分出现的时间并无所知。因此时域相差很大的信号FFT之后的频域图可能完全相同。短时傅里叶变换STFT(短时傅里叶变换)添加时域信息的方法是设置窗格,认为窗格内的信号是平稳信号,对窗格内的信号分段进行FT分析。优点是可以获得频域信息的同时可以获得时域信息。缺点是窗格

  • 【JVM调优实战100例】03——JVM堆调优四例

    前言 ?作者简介:半旧518,长跑型选手,立志坚持写10年博客,专注于java后端 ☕专栏简介:实战案例驱动介绍JVM知识,教你用JVM排除故障、评估代码、优化性能 ?文章简介:介绍堆的相关概念、教你排查5个常见的JVM堆案例实战 文章目录6.堆6.1堆的特点6.2堆内存溢出问题6.3代码内存性能影响的评估6.4多次垃圾回收内存占用仍很高问题的排查6.堆6.1堆的特点使用new关键字创建的对象都会使用堆。特点:线程共享,堆中的对象需要考虑线程安全问题。具有垃圾回收机制。6.2堆内存溢出问题堆中具有垃圾回收机制,但是垃圾回收的前提是堆中的对象不再被引用(实际上,回收引用的算法是根可达算法,后面会讲述,这里的表述是不准确的),因此如果我们有过多无法被回收的对象,就可能导致内存溢出。publicclassMemoryOverFlow{ publicstaticvoidmain(String[]args){ inti=0; Stringa="hello"; Listlist=newArrayList();//直到catch代码块执行,一直被使用 try{ while(tru

  • Innodb中的事务隔离级别和锁的关系

    前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 #一次封锁or两段锁?因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。这种方式可以有效的避免循环死锁,但在数据库中却不适用,因为在事务开始阶段,数据库并不知道会用到哪些数据。数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁) 加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁(共享锁,其它事务可以继续加共享锁,但不能加排它锁),在进行写操作之前要申请并获得X锁(排它锁,其它事务不能再获得任何锁)。加锁不成功,则事务进入等待状态,直到加锁成功才继续

  • Hadoop Ls命令添加显示条数限制參数

    前言在hadoop的FsShell命令中,预计非常多人比較经常使用的就是hadoopfs-ls,-lsr,-cat等等这种与Linux系统中差点儿一致的文件系统相关的命令.可是细致想想,这里还是有一些些的不同的.首先,从规模的本身来看,单机版的文件系统,文件数目少,内容不多,而HDFS则是一个分布式系统,里面能容纳巨大数量的文件文件夹.因此在这个前提之下,你假设任意运行ls或lsr命令,有的时候会得到恐怖的数据条数的显示记录,有的时候我们不得不通过Ctrl+C的方式中止命令.所以对于未知文件夹的命令运行,能否够在ls命令中添加显示限制的參数呢,这样能够控制一下文件记录信息的数量.这就是本文的一个出发点.Ls命令工作流程要想加入參数,就要先理解眼下Ls命令工作的原理和过程.以下我从源码的层面进行简单的分析.首先这里有个结构关系:Ls-->FsCommand-->Command从左到右依次为孩子到父亲.所以Command类是最基础的类,命令行操作的运行入口就在这里.进入到Command.java方法中,你会看到有以下这种方法:/** *Invokesthecommandhand

  • 字符串string

    一、介绍 字符串类型,属于抽象数据类型库,支持可变长字符串。 内置类型是由C++语言直接定义的。比如数字和字符,体现了大多数计算机硬件本身具备的能力。 标准库定义了另外一组更高级性质的类型,它们尚未直接实现到计算机硬件中。 string表示可变长字符序列,使用时必须包含string头文件,作为标准库的一部分,string定义在命名空间std中。 #include<string> usingstd::string; 复制 二、定义和初始化string对象 如何初始化类的对象是由类本身决定的。一个类可以定义很多种初始化对象的方式,只不过这些方式之间必须有所区别。如下是初始化string对象最常用的一些方式: strings1; //默认初始化,s1是一个空字符串,即该string对象中没有任何字符 strings2(s1); //s2是s1的副本 strings2=s1; //等价于s2(s1) //如果提供了一个字符串字面值,则该字面值中除了最后那个空字符外其他所有的字符都被拷贝到新创建的 //string对象中去 strings3("value");

  • 通过JDBC方式连接ClickHouse

    操作步骤 使用Eclipse或其他IDE工具创建Maven项目并引入ClickHouse驱动依赖包。   <dependency> <groupId>ru.yandex.clickhouse</groupId> <artifactId>clickhouse-jdbc</artifactId> <version>0.2.4</version> </dependency>复制 编写应用程序代码。 以下代码演示了如何使用JDBC驱动连接实例,使用过程需修改实例连接串和端口参数。如果应用和ClickHouse实例在同一个VPC环境,请使用实例VPC地址,如果不在相同的VPC环境则需使用实例外网地址,如何获取,请参见申请外网地址。   importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.ResultSet; importjava.sql.SQLException; import

  • 【转】在 iframe 上无法捕获 mousemove

    转:https://blog.csdn.net/DongFuPanda/article/details/109533365 在父级给document添加mousemove时间,实现一个拖拽功能。当拖到iframe上方时,发现变得卡顿,开始还以为是代码要优化,后来发现是iframe搞的鬼。解决方法也很简单,在mousedown和mouseup给iframe添加个样式 functiononMouseDown(){ document.querySelector('iframe').style['pointer-events']='none' //... } functiononMouseUp(){ document.querySelector('iframe').style['pointer-events']='auto' //... } 复制   

  • python中requests库使用方法详解

    python中requests库使用方法详解 目录python中requests库使用方法详解官方文档什么是Requests安装Requests库各种请求方式基本的GET请求带参数的GET请求解析json添加headers基本POST请求响应response属性高级操作获取cookie会话维持、模拟登陆证书验证(SSLCertVerification)认证设置代理设置超时设置异常处理上传文件带参数的GET请求->headers带参数的GET请求->cookies发送post请求,模拟浏览器的登录行为补充json 官方文档 requests的具体安装过程请看:http://docs.python-requests.org/en/latest/user/install.html#install requests的官方指南文档:http://docs.python-requests.org/en/latest/user/quickstart.html requests的高级指南文档:http://docs.python-requests.org/en/latest/user/ad

  • Bazinga

    Bazinga TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/65536K(Java/Others)TotalSubmission(s):593    AcceptedSubmission(s):241 ProblemDescription Ladiesandgentlemen,pleasesitupstraight.Don'ttiltyourhead.I'mserious.For n givenstrings S1,S2,⋯,Sn,labelledfrom 1 to n,youshouldfindthelargest i (1≤i≤n) suchthatthereexistsaninteger j (1≤j<i) and Sj isnotasubstringof Si.Asubstrin

相关推荐

推荐阅读