Gorgeousdays - 杂谈
type: channel
link: http://drinkmilker.com/index.php/category/zatan
items: 从docker v0.1.0开始
items: 打造RSS信息流
items: 期权定价基础
items: Redis学习笔记
items: 英文文本情绪分类数据集整理
items: Conda SSLError
items: Hadoop学习笔记
items: 记一次数据丢失
items: 使用Echarts报错
items: npm run serve后发生了什么

从docker v0.1.0开始
type: item
date: 2024-07-14T19:36:00+08:00
description: code:https://github.com/moby/moby/tree/v0.1.0代码结构 ├── archive.go ├── archive_test.go ├── auth # 主要用于服务器认证 │ ├── auth.go │ └── auth_test.go ├── AUTHORS ├── changes.go ├── commands.go ├── container.go ├── container_test.go ├── contrib # 一些脚本的源码 │ ├── install.sh │ ├── mkimage-busybox.sh │ └── README ├── deb # 系统打包源码 │ ├── debian │ │ ├── changelog │ │ ├── compat │ │ ├── control │ │ ├── copyright │ │ ├── docs │ │ ├── rules │ │ └── source │ │ └── format │ ├── etc │ │ ├── docker-dev.upstart │ │ └── docker.upstart │ ├── Makefile -> ../Makefile │ ├── Makefile.deb │ └── README.md -> ../README.md ├── docker # 实现docker核心功能 │ └── docker.go # 程序入口 ├── docs # 文档目录 │ ├── images-repositories-push-pull.md │ └── README.md ├── graph.go ├── graph_test.go ├── image.go ├── LICENSE ├── lxc_template.go ├── mount_darwin.go ├── mount.go ├── mount_linux.go ├── network.go ├── network_test.go ├── NOTICE ├── puppet # 基于puppet部署工具的相关源码 │ ├── manifests │ │ └── quantal64.pp │ └── modules │ └── docker │ ├── manifests │ │ └── init.pp │ └── templates │ ├── dockerd.conf │ └── profile ├── rcli # Remote Command-Line Interface 一个简单协议的命令行界面 │ ├── http.go │ ├── tcp.go │ └── types.go ├── README.md ├── registry.go ├── runtime.go ├── runtime_test.go ├── state.go ├── sysinit.go ├── tags.go ├── term # term的跨平台支持 │ ├── term.go │ ├── termios_darwin.go │ └── termios_linux.go ├── utils.go ├── utils_test.go └── Vagrantfile后面go.mod发展参考链接https://learn-docker-the-hard-way.readthedocs.io本文概述本文讲述笔者在学习docker过程中的心路历程，从docker的整体框架开始初识docker，之后开始阅读v0.1.0版本的docker源码，然后跟着教程用go实现了一个mini的docker，最后再去回看docker的源码，总结而言，是一个理论指导实践，实践加深理论的理论与实践的循环学习过程。初识dockerDocker is a set of platform as a service(PaaS) products that use OS-level virtualization to deliver software in packages called containers.这是wikipedia上对docker的定义，这句话高瞻远瞩地从宏观上告诉了我们docker是什么，确实很难找到比这更为准确的定义，但是，OS-level的虚拟化技术又是指什么，为什么要有docker，容器又有什么用呢？在接触docker之前一个相关的概念是虚拟机，它可以模拟完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。它与docker一样，都是一种虚拟化技术，不同点在于：Docker 属于 Linux 容器的一种封装，提供简单易用的容器使用接口。它并不是完整的操作系统，…

打造RSS信息流
type: item
date: 2023-02-16T18:43:00+08:00
description: 感觉每天要看的东西有点多，而且这些内容分散在各个网站、公众号。要花时间访问多个应用来获取资讯属实是有点麻烦，那不妨用RSS来提升体验。先找个合适的RSS的阅读器，主要需求是PC端和手机端能够同步，Feedly是挺好的，不过国内用起来应该不太舒服，除非一直挂着代理。综合考虑，最后PC端选择了Fluent-reader，手机端选择了Fluent-reader-lite。直接从github上下Release版本就行。https://github.com/yang991178/fluent-readerhttps://github.com/yang991178/fluent-reader-lite因为Fluent-reader-lite支持fever api，为了实现同步服务，就需要搭建一个rss订阅工具。由于Miniflux的配置较为简单，就选了它。配置Miniflux先配置个postgres数据库# 创建数据库存储目录 sudo mkdir -p /data/postgresql_data sudo docker run -d --name postgres --restart=always --net=host \ -e POSTGRES_USER=dbadmin \ -e POSTGRES_PASSWORD=123456 \ -e POSTGRES_DB=miniflux \ -p 5432:5432 \ -v /data/postgresql_data:/var/lib/postgresql/data postgres:13然后安装一下miniflux# 改个BASE_URL就行 sudo docker run -d --name miniflux --restart=always --net=host \ -e DATABASE_URL=postgres://dbadmin:souk5ping8CLULwhik@127.0.0.1/miniflux?sslmode=disable \ -e RUN_MIGRATIONS=1 \ -e CREATE_ADMIN=1 \ -e ADMIN_USERNAME=admin \ -e ADMIN_PASSWORD=123456 \ -e POLLING_FREQUENCY=30 \ -e BASE_URL=http://47.118.38.242:8080 \ -p 8080:8080 miniflux/miniflux然后访问 IP:8080就行了，如果是云服务记得把云平台的端口打开。如果要域名访问的话，再配个nginx。打开设置里的"集成"，启用Fever API，在手机和PC上配置一下，就完成了，接下来就是添加自己感兴趣的RSS源。由于很多网站本身是不支持RSS源的，可以用RSSHUB，它写好了一些解析规则。但是国内访问rsshub也不太方便，也是就自建一个rsshub的服务。sudo docker run -d --name rsshub --restart=always -p 1200:1200 -e CACHE_EXPIRE=600 diygod/rsshub创建好后，直接进入服务在RSSHUB（https://docs.rsshub.app）上找感兴趣的rss源，把前缀（https://rsshub.app）替换为http://域名：端口就行了，域名和端口均为云上RSS服务的。还有个浏览器插件RSSHUB-Rader（https://github.com/DIYgod/RSSHub-Radar）也顺便装了一下，对于用户访问的网页，它可以自动生成rss参考：https://www.wolai.com/7n4LGrG96sJmCrwJU1tCdj

期权定价基础
type: item
date: 2022-07-14T13:27:00+08:00
description: 风险管理与金融衍生物风险风险：结果的不确定性金融衍生物（financial derivatives）是一种风险管理的工具，它的价值依赖于其他更基本的原生资产（标的资产）（underlying assets）的变化而变化。三种最基本的金融衍生工具：远期合约（forward contracts）,期货（futures）和期权（options）。如果原生资产是股票，债券，汇率...，则有股票期货（期权），债券期货（期权），货币期货（期权）......远期合约远期合约：在未来确定时间内，以确定价格购（销）一定数量和质量的某原生资产的协议。合约的购入方为多头（long position），销售方为空头(short position)。合约中标明的确定价格和确定日期为交割价（delivery price）和交割日（maturity）远期合约在交割日的收益 $$ V_T=S_T-K（多头方）\\ V_T=K-S_T（空头方） $$其中K为交割价格，T为交易日，V表示收益，$S_T$表示原生资产在T日的价格远期合约一般都在场外交易（over-the-counter,OTC）期货期货跟远程合约相同，但是它是由远期合约逐步标准化而形成的，它们之间的区别在于期货交易通常在交易所期货合约具有标准化条约期货合约上的交割价格通常是由场内交易决定的，它依赖于供求关系期权期权：持有人在确定时间，按确定价格向出售方购（销）一定数量和质量的原生资产的协议，但他不承担必须购入（销售）的义务。期权持有人具有实施协议的权利，但没有必须实施的义务。确定价称为实施价格（exercise price）或敲定价格（strike price），确定日期称为到期日（expiry date），按期权合约规定执行或销售原生资产称为实施（exercise）.期权按合约中购入和销售原生资产来划分：看涨期权（call option）:一张在确定时间，按确定价格有权购入一定数量和质量的原生资产的合约。看跌期权（put option）：一张在确定时间，按确定价格有权出售一定数量和质量的原生资产的合约。期权按合约中有关实施的条约来划分：欧式期权（European options）：只能在合约规定的到期日实施美式期权（American options）：能在合约规定的到期日以前（包括到期日）的任何一个工作日实施。 $$ V_T=(S_T-K)^+ \quad(call \quad option)\\ V_T=(K-S_T)^+ \quad(put \quad option) $$期权是一种未定权益（contingent claim）。为取得这个权益需要付出的代价称为期权金（premium），因此持有人总收益P为 $$ P_T=(S_T-K)^+-p \quad(call \quad option)\\ P_T=(K-S_T)^+-p \quad(put \quad option) $$期权定价期权定价问题即为求$V=V(S,t),(0\le S < \infty,0\le t\le T)$,使得 $$ V(S,T)=\left\{ \begin{gathered} (S-K)^+ \quad(call \quad option)\\ (K-S)^+ \quad(put \quad option) \end{gathered} \right. $$t时刻原生资产价格为$S_t$，期权价格为$V_t$交易者的类型套期保值者（hedger）:两面下注避免损失。投机者（speculator）：甘愿用资金去冒险，不断其买进卖出衍生证券（期货、期权），希望从市场价格的经常变化中获取利润的行为。投资与期权与直接投资于原生资产相比具有高回报、高风险的特点；其原因在于：期权投资的杠杆作用（leverage）很大,投资人通过投入少量资金（支付期权金），而实际进行的是比它大数倍的原生资产的投资。套利者（arbitrageur）：基于对同一类风险资产的观察，利用市场价格的差异，在不同的市场同时进行交易，获取瞬时无风险利润。套利与投机不同；投机是基于对未来价格水平的预测，以牟取利润，这是有风险的。套利是利用不同市场在价格联系上的差异的现实，以谋取利润，这是无风险的。Black-Scholes 模型为了对期权进行定价，需要构建一个由金融衍生品和标的资产组成的无风险套利组合。在无套利的条件下，交易组合的收益率等于无风险收益率$r_f$。当前讨论的期权以股票作为标的资产，并假设其价格遵循几何布朗运动。$$ dS(t) = \mu S(t)dt +\sigma S(t)dW(t) $$其中$\mu$是预计收益率，即$r_f$,$\sigma$表示股票价格的波动率，其中$\mu$和$\sigma$都是常量。$dW(t)$受布朗运动影…

Redis学习笔记
type: item
date: 2022-05-30T12:52:32+08:00
description: 服务端与客户端启动# 启动服务端 redis-server.exe # 启动本地客户端 redis-cli.exe # 启动远程客户端 redis-cli.exe -h host -p port -a passwordKey# 创建key SET key value # 删除key DEL key # 序列化key DUMP key # 检查key是否存在 EXISTS key # 设置key过期时间 秒|过期时间戳（秒）|毫秒为单位|过期时间戳（毫秒） [EXPIPE|EXPIPEAT|PEXPIRE|PEXPIPEAT] key [seconds|timestamp|milliseconds|milliseconds-timestamp] # 查找所有符合给定模式（pattern）的key e.g. [KEYS test] [KEYS *] KEYS pattern # 将当前db的key移动到给定db MOVE key db # 移除key过期时间 PERSIST key # 返回key的过期时间 毫秒|秒 [PTTL|TTL] key # 从当前db随机返回一个key RANDOMKEY # 修改key名称 如果存在newkey 则会覆盖 RENAME key newkey # 仅当newkey不存在时，将key改名为newkey RENAMENX key newkey # 迭代数据库中的数据库键 SCAN cursor [MATCH pattern][COUNT count] # 返回key所存储的值的类型 TYPE key 基本数据结构String、Hash、List、Set、ZSet(Sorted Set)、HyperLogLog(Redis 2.8.9+，用于基数（不重复元素个数）统计)、GEO(Redis 3.2+，存储地理位置信息)、Stream(Redis 5.0+，主要用于消息队列，实现消息的持久化和主备复制功能)发布订阅发布订阅可以分发消息，但是无法记录历史消息，无法消息持久化。如果网络端口、Redis宕机，则消息被丢弃# 订阅客户端 SUBSCRIBE channel [channel ...] # 发布客户端 PUBLISH channel message事务# 开始事务 MULTI # 执行所有事务块 （命令一般放在MULTI和EXEC中间） EXEC # 取消事务 DISCARD # 监视一个或多个key，如果key在事务执行前改动，则事务被打断 WATCH key [key...] # 取消对所有key的监视 UNWATCH其它# 执行lua脚本 EVAL script numkeys key [key ...] arg [arg ...] # 验证密码 AUTH password # 切换指定数据 SELECT index # 查看服务运行状态 PING # 获取服务端信息 INFO # 数据备份 在redis安装目录创建dump.rdb SAVE # CONFIG可以获取redis目录，数据恢复，将dump.rdb移动到redis安装目录并启动服务即可 CONFIG GET dir # 创建redis备份文件 BGSAVE # 设置密码 CONFIG set requirepass "password" # 性能测试 redis-benchmark [option] [option value]相关基本数据结构：String、Hash、List、Set、ZSet(Sorted Set)、HyperLogLog(Redis 2.8.9+，用于基数（不重复元素个数）统计)、GEO(Redis 3.2+，存储地理位置信息)、Stream(Redis 5.0+，主要用于消息队列，实现消息的持久化和主备复制功能)使用场景：计数器：利用redis中原子性的自增操作；缓存：减轻mysql压力；排行榜：利用zset实现；消息队列；会话缓存持久化：RDB持久化保存某个时间点的全部数据（只有一个文件便于保存，但是中间redis出故障会导致数据丢失）；AOF持久化记录所有变更数据库状态的指令，以append的形式追加保存到AOF文件中（即便中途出故障，服务器当机，也可以通过redis-check-aof来解决数据一致性问题，数据量过大启动效率低）。哨兵模式：哨兵至少需要三个实例来保持自己的健壮性。集群监控：负责监控 redis master 和 slave 进程是否正常工作。消息通知：如果某个 redis 实例有故障，那么哨兵负责发送消息作为报警通知给管理员。故障转移：如果 master node 挂掉了，会自动转移到 slave node 上。配置中心：如果故障转移发生了，通知 client 客户端新的 m…

英文文本情绪分类数据集整理
type: item
date: 2022-05-25T15:01:54+08:00
description: EmotionLinepaper：https://arxiv.org/pdf/1802.08379v2.pdfdataset：http://doraemon.iis.sinica.edu.tw/emotionlines/download.html需要填表申请数据集，基于对话标注的情绪，来自2000个对话的29245个标记的话。含有八类anger, disgust, fear, happiness, sadness, surprise, neutral, and non-neutral.（non-neutral表示含有两种及以上不同的情绪）ISEARpaper：https://doi.org/10.1037/0022-3514.67.1.55dataset:https://www.unige.ch/cisa/research/materials-and-online-research/research-material/有来自五大洲37个个国家的3000名受访者的数据，基于问卷采集的数据，含7类情感1 = JOY, 2 = FEAR, 3 = ANGER, 4 = SADNESS, 5 = DISGUST, 6 = SHAME, 7 = GUILTKaggle上有处理好的数据集 https://www.kaggle.com/datasets/faisalsanto007/isear-datasetSILICONEpaper：https://arxiv.org/pdf/2009.11152v3.pdfdataset:https://huggingface.co/datasets/silicone整合了各领域的口语场景，英文数据集，部分数据集包含情绪标签，其情绪分析数据集子集的数据格式{ 'Utterance': "'oh , breaktime flies .'", 'Emotion': 5, # "sadness" 'Dialogue_ID': "997" }GoEmotionspaper：https://arxiv.org/pdf/2005.00547v2.pdfdataset:https://github.com/google-research/google-research/tree/master/goemotions2020年google开源的数据集，有58009句话，27个label，最长序列长度为30情绪标签为：admiration, amusement, anger, annoyance, approval, caring, confusion, curiosity, desire, disappointment, disapproval, disgust, embarrassment, excitement, fear, gratitude, grief, joy, love, nervousness, optimism, pride, realization, relief, remorse, sadness, surprise.huggingface上也有https://huggingface.co/datasets/go_emotionsEmotion Datasetpaper:https://www.aclweb.org/anthology/D18-1404/dataset:https://github.com/dair-ai/emotion_dataset推特上的评论，含有6类情绪

Conda SSLError
type: item
date: 2022-03-20T09:47:54+08:00
description: 在使用anaconda创建环境时出现错误Solving environment: failed CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/noarch/repodata.json> Elapsed: - An HTTP error occurred when trying to retrieve this URL. HTTP errors are often intermittent, and a simple retry will get you on your way. SSLError(MaxRetryError('HTTPSConnectionPool(host=\'mirrors.tuna.tsinghua.edu.cn\', port=443): Max retries exceeded with url: /anaconda/pkgs/free/noarch/repodata.json (Caused by SSLError(SSLError("bad handshake: Error([(\'SSL routines\', \'ssl3_get_server_certificate\', \'certificate verify failed\')])")))')) 尝试重新配置源# 重置源配置 conda config --remove-key channels # 重新添加清华源 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ conda config --set show_channel_urls yes # 查看效果 cat ~/.condarc没什么用为防火墙的问题，通过如下命令解决conda config --set ssl_verify false

Hadoop学习笔记
type: item
date: 2022-02-15T19:03:10+08:00
description: Hadoop简介核心组件：Hadoop HDFS（分布式文件存储系统）：解决海量数据存储Hadoop YARN（集群资源管理和任务调度框架）：解决资源任务调度Hadoop MapReduce（分布式计算框架）：解决海量数据计算特性：扩容能力：集群可扩展到数以千计的节点成本低：运行通过普通机器组成集群效率高：并发处理数据可靠性：自动维护数据的多份复制，并在任务失败后能自动重新部署Hadoop 集群Hadoop集群包含两个集群，两个集群都是主从架构集群，逻辑上分类、物理上在一起：HDFS集群（分布式存储）：NameNode+DataNode+SecondaryNameNodeYARN集群（资源管理、调度）：ResourceManger+NodeManagerHadoop源码编译（或者可以直接下载jar包）：安装依赖yum install gcc gcc-c++ make autoconf automake libtool curl lzo-devel zlib-devel openssl openssl-devel ncurses-devel snappy snappy-devel bzip2 bzip2-devel lzo lzo-devel lzop libXtst zlib -y yum install -y doxygen cyrus-sasl* saslwrapper-devel*安装cmake、snappy，需要版本支持安装JDK1.8并配置环境变量安装配置maven，配置环境变量，配置阿里云仓库安装ProtocolBuffer 3.7.1编译Hadooptar zxvf hadoop-3.3.0-src.tar.gz cd /root/hadoop-3.3.0-src mvn clean package -Pdist,native -DskipTests -Dtar -Dbundle.snappy -Dsnappy.lib=/usr/local/libHadoop集群分布式安装：集群规划，主机角色安排基础环境配置，配置各台设备hosts，同步集群时间，防火墙关闭，ssh免密登录，JDK1.8环境解压hadoop包（这里直接采用官网的包，也可以采用上面的编译源码实现）tar zxvf hadoop-3.3.0-Centos7-64-with-snappy.tar.gz修改配置文件hadoop-env.sh#文件最后添加 export JAVA_HOME=/export/server/jdk1.8.0_241 export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root core-site.xml：集群全局参数hdfs-site.xml：HDFS参数mapred-site.xml：MapReduce参数yarn-site.xml：YARN参数分发同步hadoop安装包，在一台机器上配置好分发到集群其它机器cd /export/server scp -r hadoop-3.3.0 root@node2:$PWD scp -r hadoop-3.3.0 root@node3:$PWD添加Hadoop到环境变量Hadoop集群启动首次启动需要格式化namenodehdfs namenode -format脚本启动与关闭#HDFS集群 start-dfs.sh stop-dfs.sh #YARN集群 start-yarn.sh stop-yarn.sh #Hadoop集群 start-all.sh stop-all.shWeb UI PageHDFS集群：http://node1:9870/YARN集群：http://node1:8088/Hadoop HDFSHDFS应用场景：适合场景：大文件、数据流式访问、一次写入多次读出、低成本部署，廉价PC、高容错不适合场景：小文件、数据交互式访问、频繁任意修改、低延迟处理HDFS整体概述（重要特性）：主从架构：Namenode是HDFS主节点，存储元数据，DataNode从节点，存储数据分块存储：文件在物理上是分块存储（block），默认block-size为128M，不足128M为一块。更改默认块大小可以修改hdfs-default.xml中dfs.blocksize副本机制：文件的所有block都会有副本，副本数由参数dfs.replication控制，默认值是3，也就是会额外再复制2份，连同本身总共…

记一次数据丢失
type: item
date: 2021-12-03T23:39:09+08:00
description: 前段时间为了测试云数据库的性能，建库删库不少。因为是通过宝塔平台的可视化操作的，刚开始建的那个测试的数据库排序在列表第二个，我的网站数据库是第一个。可网站刷新后我的数据库变成了第二个，而我直接就把它删掉了。全部的网站博客数据都没掉。为了恢复数据，我尝试了3个小时，试了网上能搜到的各种方法，最终根据部分日志恢复了最近3个月的数据。由于数据库没有备份，同时日志也会定期清理，整个数据恢复非常困难。在这个事件后，我立马开启了数据库的定期备份。同时，进行本地备份与云端备份。写了个网站爬虫实现将网站文章爬取到本地。Typecho爬虫代码开源在本人Github上。

使用Echarts报错
type: item
date: 2021-11-19T23:47:43+08:00
description: 当前代码即完成在页面上实现词云图的功能，一切正常。但往 中增加了上百行代码后，wordcloud为undefined，即获取不到DOM。尝试网上的什么异步方法，jq......均不行。更改mounted为updated生效。由于DOM中的某个DOM采用了v-if、v-show 或者 v-for（即根据获取到的后台数据来动态操作 DOM，即响应式），则DOM无法在mounted阶段获取到。mounted为加载阶段，而updated阶段则是完成了数据更新到DOM的阶段，使用this.$refs.wordcloudchart就能找到DOM。参考链接：https://www.cnblogs.com/menxiaojin/p/14236647.html

npm run serve后发生了什么
type: item
date: 2021-10-16T14:35:00+08:00
description: 在用vue-cli脚手架创建项目后通常用npm run serve来启动项目，但是这中间到底发生了什么呢？溯源通过vue create test创建测试目录，可以观察基本的目录结构为├── test | ├── node_modules // 当前项目所有依赖，一般不可以移植给其他电脑环境 | ├── public | | ├── favicon.ico // 标签图标 | | └── index.html // 当前项目唯一的页面 | ├── src | | ├── assets // 静态资源img、css、js | | ├── components // 小组件 | | ├── views // 页面组件 | | ├── App.vue // 根组件 | | ├── main.js // 全局脚本文件（项目的入口） | | ├── router | | | └── index.js// 路由脚本文件（配置路由 url链接 与 页面组件的映射关系） | | └── store | | | └── index.js// 仓库脚本文件（vuex插件的配置文件，数据仓库） | ├── README.md └ └── package.json等配置文件查看根目录下的package.json文件，存在如下代码 "scripts": { "serve": "vue-cli-service serve", "build": "vue-cli-service build", "lint": "vue-cli-service lint" },这里的serve就是npm run serve的serve，即通过serve定位到这里后npm run serve就相当于执行`vue-cli-service serve命令。这里我们也可以将serve改为dev然后执行npm run dev，效果是一样的。可我执行在命令行下输入vue-cli-service是无效的，那npm run serve是如何启动的呢？原来运行npm run serve命令时npm会把node_modules下的.bin目录添加到Path，执行完后再删掉。node_modules\.bin\vue-cli-service相当于一个快捷方式，它被添加到了环境变量，但它指向的是node_modules\@vue\cli-service\bin\vue-cli-service.js。综上所述，npm run serve就是在运行vue-cli-service.js这个js文件函数解析#!/usr/bin/env node const { semver, error } = require('@vue/cli-shared-utils') const requiredVersion = require('../package.json').engines.node // 检测node版本是否符合vue-cli运行的需求。不符合则打印错误并退出。 if (!semver.satisfies(process.version, requiredVersion, { includePrerelease: true })) { error( `You are using Node ${process.version}, but vue-cli-service ` + `requires Node ${requiredVersion}.\nPlease upgrade your Node version.` ) process.exit(1) } // cli-service的核心类 const Service = require('../lib/Service') // 新建一个service的实例。并将项目路径传入 const service = new Service(process.env.VUE_CLI_CONTEXT || process.cwd())// 传入当前项目的所在路径 // 参数处理 const rawArgv = process.argv.slice(2) // minimist 命令行参数解析器 const args = require('minimist')(rawArgv, { boolean: [ // build 'modern', 'report', 'report-json', 'inline-vue', 'watch', // serve 'open', 'copy', 'https', // inspect 'verbose' ] }) const command = args._[0] // 将参数传入service这个实例并启动后续工作。如果我们运行…