关于yarn:yarn-install-命令行执行时背后发生的事情

在深刻解析 yarn install 命令行执行的背地过程之前,让咱们先对 Yarn 有一个根本的意识。Yarn 是一个古代的包管理工具,它为 JavaScript 社区提供了一个疾速、牢靠、平安的形式来治理我的项目依赖。从 Yarn 的初衷来看,它旨在解决 npm(Node Package Manager)在解决大型项目、依赖治理以及装置速度方面的一些问题。 当你在我的项目目录下执行 yarn install 命令时,Yarn 会经验几个要害的步骤来确保依赖被正确装置,这个过程涵盖了解析依赖、查找、下载以及链接这些依赖包。接下来,我将具体解释这一过程的每个步骤,并举例说明。 1. 解析 package.json 文件首先,Yarn 会读取我的项目根目录下的 package.json 文件。这个文件是一个 JSON 格局的文档,列出了我的项目的依赖(包含间接依赖和开发依赖)、版本号、脚本命令等信息。Yarn 通过解析这个文件来确定须要装置哪些包以及这些包的版本束缚。 2. 查看 .yarnrc 和 .npmrc 配置文件Yarn 还会查看我的项目目录或用户主目录下的 .yarnrc 和 .npmrc 文件,这些文件蕴含了包管理器的配置选项,如代理设置、镜像源地址等。这些配置能够影响 Yarn 的行为,比方它会从哪个源下载包。 3. 生成 yarn.lock 文件如果是首次运行 yarn install 或者 package.json 中的依赖有更新,Yarn 会生成(或更新)一个 yarn.lock 文件。这个文件锁定了我的项目依赖的具体版本,确保了团队成员之间装置的依赖一致性,防止了“在我的机器上能够运行”的问题。 4. 解析依赖Yarn 会依据 package.json 和 yarn.lock (如果存在)中的信息,解析出须要装置的所有依赖及其版本。在这个过程中,Yarn 会计算依赖树,确定哪些包是间接依赖,哪些包是间接依赖。 5. 查找并下载依赖接下来,Yarn 会查问本地缓存,看看所需的包版本是否曾经下载过。如果缓存中没有,Yarn 则会从近程仓库(如 npm 官网仓库或配置的镜像源)下载包到本地缓存。这一步骤是并发执行的,大大放慢了依赖的下载速度。 6. 链接依赖下载实现后,Yarn 会将这些包从本地缓存复制到 node_modules 目录,并依据依赖关系进行链接。这个步骤确保了我的项目代码能够正确地援用到装置的包。 ...

March 1, 2024 · 1 min · jiezi

关于yarn:Cesium加载广告牌三

Cesium加载广告牌(三)加载实现广告牌之后,如何对广告牌进行操作?这里实现鼠标左键点击获取广告牌信息的性能。 在加载广告牌的过程中,曾经对广告牌进行了许多属性的设置,然而并没有对广告牌的惟一值进行标准。设置惟一值并不是在billboard的属性内设置,而是在外层的Entity内进行申明。同时Entity中也有name属性。这里须要留神的是id是惟一值,不能与其余id值雷同,name能够。 let bill = new Cesium.Entity({ id:"200222", position: new Cesium.Cartesian3.fromDegrees(120.62521517, 31.42803100), billboard: { image: "./img/laboratory.png", horizontalOrigin: Cesium.HorizontalOrigin.CENTER, verticalOrigin: Cesium.VerticalOrigin.BOTTOM, scale: 1, scaleByDistance: new Cesium.NearFarScalar(30000, 1, 45000, 0.4), heightReference: Cesium.HeightReference.CLAMP_TO_GROUND, disableDepthTestDistance: Number.POSITIVE_INFINITY, }})这里有一点须要强调,代买只是申明了一个Entity实例,并没有进行增加,因而须要将Entity增加仅viewer实体中才能够应用。 viewer.entities.add(bill)如果写成 viewer.entities.add({})模式,就不须要额定增加。 增加实现后须要写入点击事件。 let handlerPoint = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas); handlerPoint.setInputAction(function(event) {},Cesium.ScreenSpaceEventType.LEFT_CLICK)在点击事件外面采纳viewer.scene.pick()办法,通过坐标地位,拾取实体(Entity),图元(Primitive),3DTiles对象,返回的是scene中指定地位最上层的对象。例如点击获取Entity的pick对象,通过pick.id能够拾取以后的entity对象。拾取后,能够用于扭转对象的属性参数,如色彩,图片等。 let handlerPoint = new Cesium.ScreenSpaceEventHandler(window.viewer.scene.canvas); handlerPoint.setInputAction(function(event) { const pick = window.viewer.scene.pick(event.position); console.log(pick)},Cesium.ScreenSpaceEventType.LEFT_CLICK)这里的pick中就存储了广告牌的信息,而后依据获取的广告牌的id不同,能够进行接下来的其余操作。

April 22, 2023 · 1 min · jiezi

关于yarn:深入浅出-Yarn-架构与实现61-NodeManager-功能概述

本节开始将对 Yarn 中的 NodeManager 服务进行分析。NodeManager 须要在每个计算节点上运行,与 ResourceManager 和 ApplicationMaster 进行交互。治理节点的计算资源以及调度容器。后续将对 NM 的性能职责、状态机、容器生命周期和资源隔离等方面进行解说。本篇将从整体上对 NM 进行介绍。 一、NodeManager 根本职能在 Hadoop 集群中,每个计算节点都须要有一个治理服务,其就是 NodeManager(NM)。它负责与 ResourceManager 放弃通信,治理 Container 的生命周期,监控每个 Container 的资源应用状况,追踪节点健康状况,治理日志等。主要职责: 放弃与 ResourceManager 同步跟踪节点的健康状况治理节点各个 Container 的生命周期,监控每个 Container 的资源应用状况治理分布式缓存(对 Container 所需的 Jar,库文件的本地文件系统缓存)治理各个 Container 生成日志整体来说,NM 通过两个 RPC 协定与 RM 和 AM 交互,如下图所示。 一)与 RM 交互通过 ResourceTrackerProtocol 协定: NM 通过该 RPC 协定向 RM 注册、汇报节点健康状况和 Container 运行状态;支付 RM 下达的命令,包含从新初始化、清理 Container 占用资源等。在该协定中,RM 表演 RPC server 的角色,而 NM 表演 RPC Client 的角色(由外部组件 NodeStatusUpdater 实现)。NM 与 RM 之间采纳 「pull 模型」,NM 总是周期性地被动向 RM 发动申请,并支付下达给本人的命令。 ...

March 31, 2023 · 2 min · jiezi

关于yarn:深入浅出-Yarn-架构与实现46-RM-行为探究-申请与分配-Container

本大节介绍应用程序的 ApplicationMaster 在 NodeManager 胜利启动并向 ResourceManager 注册后,向 ResourceManager 申请资源(Container)到获取到资源的整个过程,以及 ResourceManager 外部波及的次要工作流程。 一、整体流程整个过程可看做以下两个阶段的送代循环: 阶段1 ApplicationMaster 汇报资源需要并支付曾经调配到的资源;阶段2 NodeManager 向 ResourceManager 汇报各个 Container 运行状态,如果 ResourceManager 发现它下面有闲暇的资源,则进行一次资源分配,并将调配的资源保留到对应的 应用程序数据结构中,期待下次 ApplicationMaster 发送心跳信息时获取(即阶段1)。一)AM 汇报心跳1、ApplicationMaster 通过 RPC 函数 ApplicationMasterProtocol#allocate 向 ResourceManager 汇报资源需要(因为该函数被周期性调用,咱们通常也称之为“心跳”),包含新的资源需要形容、待开释的 Container 列表、申请退出黑名单的节点列表、申请移除黑名单的节点列表等。 public AllocateResponse allocate(AllocateRequest request) { // Send the status update to the appAttempt. // 发送 RMAppAttemptEventType.STATUS_UPDATE 事件 this.rmContext.getDispatcher().getEventHandler().handle( new RMAppAttemptStatusupdateEvent(appAttemptId, request.getProgress())); // 从 am 心跳 AllocateRequest 中取出新的资源需要形容、待开释的 Container 列表、黑名单列表 List<ResourceRequest> ask = request.getAskList(); List<ContainerId> release = request.getReleaseList(); ResourceBlacklistRequest blacklistRequest = request.getResourceBlacklistRequest(); // 接下来会做一些查看(资源申请量、label、blacklist 等) // 将资源申请宰割(动静调整 container 资源量) // Split Update Resource Requests into increase and decrease. // No Exceptions are thrown here. All update errors are aggregated // and returned to the AM. List<UpdateContainerRequest> increaseResourceReqs = new ArrayList<>(); List<UpdateContainerRequest> decreaseResourceReqs = new ArrayList<>(); List<UpdateContainerError> updateContainerErrors = RMServerUtils.validateAndSplitUpdateResourceRequests(rmContext, request, maximumCapacity, increaseResourceReqs, decreaseResourceReqs); // 调用 ResourceScheduler#allocate 函数,将该 AM 资源需要汇报给 ResourceScheduler // (理论是 Capacity、Fair、Fifo 等理论指定的 Scheduler 解决) allocation = this.rScheduler.allocate(appAttemptId, ask, release, blacklistAdditions, blacklistRemovals, increaseResourceReqs, decreaseResourceReqs);}2、ResourceManager 中的 ApplicationMasterService#allocate 负责解决来自 AM 的心跳申请,收到该申请后,会发送一个 RMAppAttemptEventType.STATUS_UPDATE 事件,RMAppAttemptImpl 收到该事件后,将更新应用程序执行进度和 AMLivenessMonitor 中记录的应用程序最近更新工夫。3、调用 ResourceScheduler#allocate 函数,将该 AM 资源需要汇报给 ResourceScheduler,理论是 Capacity、Fair、Fifo 等理论指定的 Scheduler 解决。以 CapacityScheduler#allocate 实现为例: ...

March 1, 2023 · 3 min · jiezi

关于yarn:深入浅出-Yarn-架构与实现45-RM-行为探究-启动-ApplicationMaster

本节开始,将对 ResourceManager 中一些常见行为进行剖析探索,看某些具体要害的行为,在 RM 中是如何流转的。本节将深刻源码探索「启动 ApplicationMaster」的具体流程。 一、整体流程本大节介绍从应用程序提交到启动 ApplicationMaster 的整个过程,期间波及 Client、RMService、 RMAppManager、RMApplmpl、RMAppAttemptImpl、RMNode、ResourceScheduler 等几个次要组件。当客户端调用 RPC 函数 ApplicationClientProtocol#submitApplication 后, ResourceManager 端的处理过程如下图所示。 二、具体流程剖析接下来追随下面的流程图,咱们深刻源码具体分析每一步都是如何执行的:最开始由客户端发动工作提交 submitApplication(),通过 ClientRMService 和 RMAppManager 发送 RMAppEventType.START 事件,之后交由 RMAppImpl 解决。 protected void submitApplication( ApplicationSubmissionContext submissionContext, long submitTime, String user) throws YarnException { ApplicationId applicationId = submissionContext.getApplicationId(); RMAppImpl application = createAndPopulateNewRMApp(submissionContext, submitTime, user, false); Credentials credentials = null; try { credentials = parseCredentials(submissionContext); if (UserGroupInformation.isSecurityEnabled()) { this.rmContext.getDelegationTokenRenewer() .addApplicationAsync(applicationId, credentials, submissionContext.getCancelTokensWhenComplete(), application.getUser()); } else { // Dispatcher is not yet started at this time, so these START events // enqueued should be guaranteed to be first processed when dispatcher // gets started. // 这里发送 RMAppEventType.START 事件 this.rmContext.getDispatcher().getEventHandler() .handle(new RMAppEvent(applicationId, RMAppEventType.START)); }RMAppImpl 这货色是个状态机,收到事件之后会本人转换状态并且解决相应的逻辑。(状态机还不相熟的同学,可翻到我后面的文章进行学习《2-4 Yarn 根底库 - 状态机库》) ...

February 28, 2023 · 4 min · jiezi

关于yarn:yarn-换源后不生效

问题重现明天克隆下来 GitHub 上的一个我的项目装置依赖时后面的十分快(因为是从 cached 里有),最初一个却怎么也 fetch 不下来,卡在了 fetching package 问题尝试通过 --verbose 参数发现包是从 https://registry.yarnpkg.com/ 下载的,然而配置的源是 https://registry.npmmirror.com/,清理 cache yarn cache clean清理实现后从新 yarn 发现所有的包都是从官网源下载,速度极慢 问题解决通过 vscode 的搜寻性能发现,yarn.lock 文件内定义依赖的 resolved 全副是官网源,于是应用 Ctrl + F 将所有的官网源全副替换为国内镜像源,问题解决

November 19, 2022 · 1 min · jiezi

关于yarn:深入浅出-Yarn-架构与实现24-Yarn-基础库-状态机库

当一个服务领有太多解决逻辑时,会导致代码构造异样的凌乱,很难分辨一段逻辑是在哪个阶段发挥作用的。这时就能够引入状态机模型,帮忙代码构造变得清晰。 一、状态机库概述一)简介状态机由一组状态组成:【初始状态 -> 中间状态 -> 最终状态】。在一个状态机中,每个状态会接管一组特定的事件,依据事件类型进行解决,并转换到下一个状态。当转换到最终状态时则退出。 二)状态转换形式状态间转换会有上面这三种类型: 三)Yarn 状态机类在 Yarn 中提供了一个工厂类 StateMachineFactory 来帮忙定义状态机。如何应用,咱们间接写个 demo。<img src="https://cdn.nlark.com/yuque/0/2022/png/21670600/1665737645204-cf813e7c-20a1-43bf-ac2a-5b65f05ceb7e.png" alt="image.png" style="zoom:67%;" /> 二、案例 demo在上一篇文章《Yarn 服务库和事件库》案例根底上进行扩大,减少状态机库的内容。如果还不理解服务库和事件库的同学,倡议先学习下上一篇文章。案例已上传至 github,有帮忙能够点个 ⭐️https://github.com/Simon-Ace/hadoop-yarn-study-demo/tree/master/state-demo 一)状态机实现状态机实现,能够间接嵌入到上篇文章中的 AsyncDispatcher应用。这里仅给出状态机JobStateMachine以及各种事件处理的代码。残缺的代码我的项目执行,请到 github demo 中查看。 import com.shuofxz.event.JobEvent;import com.shuofxz.event.JobEventType;import org.apache.hadoop.yarn.event.EventHandler;import org.apache.hadoop.yarn.state.*;import java.util.EnumSet;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;/** 可参考 Yarn 中实现的状态机对象:* ResourceManager 中的 RMAppImpl、RMApp- AttemptImpl、RMContainerImpl 和 RMNodeImpl,* NodeManager 中 的 ApplicationImpl、 ContainerImpl 和 LocalizedResource,* MRAppMaster 中的 JobImpl、TaskImpl 和 TaskAttemptImpl 等* */@SuppressWarnings({"rawtypes", "unchecked"})public class JobStateMachine implements EventHandler<JobEvent> { private final String jobID; private EventHandler eventHandler; private final Lock writeLock; private final Lock readLock; // 定义状态机 protected static final StateMachineFactory<JobStateMachine, JobStateInternal, JobEventType, JobEvent> stateMachineFactory = new StateMachineFactory<JobStateMachine, JobStateInternal, JobEventType, JobEvent>(JobStateInternal.NEW) .addTransition(JobStateInternal.NEW, JobStateInternal.INITED, JobEventType.JOB_INIT, new InitTransition()) .addTransition(JobStateInternal.INITED, JobStateInternal.SETUP, JobEventType.JOB_START, new StartTransition()) .addTransition(JobStateInternal.SETUP, JobStateInternal.RUNNING, JobEventType.JOB_SETUP_COMPLETED, new SetupCompletedTransition()) .addTransition(JobStateInternal.RUNNING, EnumSet.of(JobStateInternal.KILLED, JobStateInternal.SUCCEEDED), JobEventType.JOB_COMPLETED, new JobTasksCompletedTransition()) .installTopology(); private final StateMachine<JobStateInternal, JobEventType, JobEvent> stateMachine; public JobStateMachine(String jobID, EventHandler eventHandler) { this.jobID = jobID; // 多线程异步解决,state 有可能被同时读写,应用读写锁来防止竞争 ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); this.readLock = readWriteLock.readLock(); this.writeLock = readWriteLock.writeLock(); this.eventHandler = eventHandler; stateMachine = stateMachineFactory.make(this); } protected StateMachine<JobStateInternal, JobEventType, JobEvent> getStateMachine() { return stateMachine; } public static class InitTransition implements SingleArcTransition<JobStateMachine, JobEvent> { @Override public void transition(JobStateMachine jobStateMachine, JobEvent jobEvent) { System.out.println("Receiving event " + jobEvent); // do something... // 实现后发送新的 Event —— JOB_START jobStateMachine.eventHandler.handle(new JobEvent(jobStateMachine.jobID, JobEventType.JOB_START)); } } public static class StartTransition implements SingleArcTransition<JobStateMachine, JobEvent> { @Override public void transition(JobStateMachine jobStateMachine, JobEvent jobEvent) { System.out.println("Receiving event " + jobEvent); jobStateMachine.eventHandler.handle(new JobEvent(jobStateMachine.jobID, JobEventType.JOB_SETUP_COMPLETED)); } } public static class SetupCompletedTransition implements SingleArcTransition<JobStateMachine, JobEvent> { @Override public void transition(JobStateMachine jobStateMachine, JobEvent jobEvent) { System.out.println("Receiving event " + jobEvent); jobStateMachine.eventHandler.handle(new JobEvent(jobStateMachine.jobID, JobEventType.JOB_COMPLETED)); } } public static class JobTasksCompletedTransition implements MultipleArcTransition<JobStateMachine, JobEvent, JobStateInternal> { @Override public JobStateInternal transition(JobStateMachine jobStateMachine, JobEvent jobEvent) { System.out.println("Receiving event " + jobEvent); // 这是多后果状态局部,因而须要人为制订后续状态 // 这里整个流程完结,设置一下对应的状态 boolean flag = true; if (flag) { return JobStateInternal.SUCCEEDED; } else { return JobStateInternal.KILLED; } } } @Override public void handle(JobEvent jobEvent) { try { // 留神这里为了防止动态条件,应用了读写锁 writeLock.lock(); JobStateInternal oldState = getInternalState(); try { getStateMachine().doTransition(jobEvent.getType(), jobEvent); } catch (InvalidStateTransitionException e) { System.out.println("Can't handle this event at current state!"); } if (oldState != getInternalState()) { System.out.println("Job Transitioned from " + oldState + " to " + getInternalState()); } } finally { writeLock.unlock(); } } public JobStateInternal getInternalState() { readLock.lock(); try { return getStateMachine().getCurrentState(); } finally { readLock.unlock(); } } public enum JobStateInternal { NEW, SETUP, INITED, RUNNING, SUCCEEDED, KILLED }}二)状态机可视化hadoop 中提供了状态机可视化的工具类 VisualizeStateMachine.java,能够拷贝到咱们的工程中应用。依据提醒,运行须要三个参数: ...

November 1, 2022 · 3 min · jiezi

关于yarn:Yarn高可用集群

批改配置文件yarn-site.xml: <?xml version="1.0"?><!-- Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. See accompanying LICENSE file.--><configuration> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <!-- 启用 resourcemanager ha --> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property> <!-- 申明 resourcemanager 的地址 --> <property> <name>yarn.resourcemanager.cluster-id</name> <value>cluster-yarn1</value> </property> <!--指定 resourcemanager 的逻辑列表--> <property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rm1,rm2,rm3</value> </property><!-- ========== rm1 的配置 ========== --> <!-- 指定 rm1 的主机名 --> <property> <name>yarn.resourcemanager.hostname.rm1</name> <value>hadoop-4</value> </property><!-- 指定 rm1 的 web 端地址 --><property> <name>yarn.resourcemanager.webapp.address.rm1</name> <value>hadoop-4:8088</value></property><!-- 指定 rm1 的外部通信地址 --><property> <name>yarn.resourcemanager.address.rm1</name> <value>hadoop-4:8032</value></property><!-- 指定 AM 向 rm1 申请资源的地址 --><property><name>yarn.resourcemanager.scheduler.address.rm1</name> <value>hadoop-4:8030</value></property><!-- 指定供 NM 连贯的地址 --> <property> <name>yarn.resourcemanager.resource-tracker.address.rm1</name> <value>hadoop-4:8031</value></property><!-- ========== rm2 的配置 ========== --> <!-- 指定 rm2 的主机名 --> <property> <name>yarn.resourcemanager.hostname.rm2</name> <value>hadoop-5</value></property><property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>hadoop-5:8088</value></property><property> <name>yarn.resourcemanager.address.rm2</name> <value>hadoop-5:8032</value></property><property> <name>yarn.resourcemanager.scheduler.address.rm2</name> <value>hadoop-5:8030</value></property><property> <name>yarn.resourcemanager.resource-tracker.address.rm2</name> <value>hadoop-5:8031</value></property><!-- ========== rm3 的配置 ========== --><!-- 指定 rm1 的主机名 --> <property> <name>yarn.resourcemanager.hostname.rm3</name> <value>hadoop-6</value></property><!-- 指定 rm1 的 web 端地址 --><property> <name>yarn.resourcemanager.webapp.address.rm3</name> <value>hadoop-6:8088</value></property><!-- 指定 rm1 的外部通信地址 --><property> <name>yarn.resourcemanager.address.rm3</name><value>hadoop-6:8032</value></property><!-- 指定 AM 向 rm1 申请资源的地址 --><property> <name>yarn.resourcemanager.scheduler.address.rm3</name> <value>hadoop-6:8030</value></property><!-- 指定供 NM 连贯的地址 --> <property> <name>yarn.resourcemanager.resource-tracker.address.rm3</name> <value>hadoop-6:8031</value></property> <!-- 指定 zookeeper 集群的地址 --> <property> <name>yarn.resourcemanager.zk-address</name> <value>hadoop-4:2181,hadoop-5:2181,hadoop-6:2181</value> </property> <!-- 启用主动复原 --> <property> <name>yarn.resourcemanager.recovery.enabled</name> <value>true</value> </property> <!-- 指定 resourcemanager 的状态信息存储在 zookeeper 集群 --> <property> <name>yarn.resourcemanager.store.class</name> <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value></property><!-- 环境变量的继承 --><property> <name>yarn.nodemanager.env-whitelist</name> <value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CONF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAPRED_HOME</value> </property><!--日志汇集--> <property> <name>yarn.log-aggregation-enable</name> <value>true</value> </property><!--日志汇集服务器地址--> <property> <name>yarn.log.server.url</name> <value>http://hadoop-4:19888/jobhistory/logs</value> </property><!--日志保留工夫--> <property> <name>yarn.log-aggregation.retain-seconds</name> <value>6048000</value> </property></configuration>获取yarn集群状态:yarn rmadmin -getServiceState rm1启动hadoop集群:start-all.sh ...

October 30, 2022 · 2 min · jiezi

关于yarn:Yarn命令

0.yarn top;查看yarn资源耗费状况 1.yarn application -list;查看所有正在运行的app 2.yarn logs -applicationId appId;查看工作运行日志 3.yarn application -list -appStates;查看不同状态的app 1. ALL NEW2. NEW_SAVING3. SUBMITTED4. ACCEPTED5. RUNNING6. FINISHED7. FAILED8. KILLED

August 19, 2022 · 1 min · jiezi

关于yarn:wallys2x4×4-or-8×8-11AX-MUMIMO-DUAL-CONCURRENT-EMBEDDEDBOARD

2x(4×4 or 8×8) 11AX MU-MIMO DUAL CONCURRENT EMBEDDEDBOARD DR8074A(HK01) IPQ8074A 4x4 2.4G 8x8 5G 802.11ax IPQ8074A 4x4 2.4G 8x8 5G 802.11ax MT7915/MT 7975/IPQ6000/IPQ6018/IPQ6010/IPQ4019/IPQ4029/ipq4018/IPQ8072/IPQ8074/QCN9074/QCN9072/QCN9024/IPQ5018/BY:Wallys Communications (Suzhou ) Co., LTDEMAIL:sales3@wallystech.com Wallys Communications (SuZhou) Co., Ltd., http://www.wallystech.com,which is a professional supplier specializing in product design, manufacturing and offering superior OEM/ODM/JDM services in wireless communications. As a specialized manufacturer and exporter for these products in China,We sincerely hope to establish business relations with your esteemed corporation. We mainly develop high power wireless products based on Quacomm chip such asIPQ6000/IPQ6018/IPQ6010/IPQ4019/IPQ4029/IPQ8072/IPQ8074/QCN9074 and so on . Product Description 8074A(HK01) based on IPQ8074A chipset is an enterprise wireless module integrated with2×2 5G high power Radio module and 2×2 2.4G high power Radio module designedspecifically to provide users with mobile access to high-bandwidth video streaming, voice, anddata transmission for office and challenging RF environment in factories, warehousesestablishment. ...

June 29, 2022 · 2 min · jiezi

关于yarn:npm问题集

短少python编译环境gyp verb could not find "python". checking python launcher解决形式:yarn global add --production windows-build-tools 全局装置编译该工具

May 13, 2022 · 1 min · jiezi

关于yarn:npx-yarn-create-npm-init

TL;DR: npx xxx yarn create npm init 以 create-react-app 为例, 文档提供三种创立应用程序的计划: npx create-react-app my-appnpm init react-app my-appyarn create react-app my-app都好用,为啥呢? npxNPM (Node Package Manager) and NPX (Node Package Executor) NPX 是包的执行器。试一下~ // npx cowsay 亖混子npx: 41 装置胜利,用时 6.739 秒 _______________< 亖混子 > --------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||用处一、以简短的形式执行本地包的命令 若执行我的项目依赖包的执行文件,须要键入以下内容:$ ./node_modules/.bin/jest ; 若应用 npx 将会十分简洁 $ npx jest 用处二、 一次性执行全局模块命令 有些全局包如 create-react-app 应用频率低,在须要时用 npx 即可 。比照全局装置,可保障应用最新版本 ...

January 28, 2022 · 1 min · jiezi

关于yarn:yarn的安装与使用

一、yarn 是什么?yarn 也是一个软件包管理系统,同样用于治理 用 JavaScript 编写的软件包,yarn 的呈现是为了补救 npm 的一些缺点。yarn 与 npm 的区别,看这里! 二、装置 yarn 到我的项目中# 1、装置全局yarn(这样任何目录都能够应用yarn) npm install -g yarn# 2、切换到我的项目目录 cd ~/path/to/project# 3、我的项目应用的版本(berry是我的项目代号,示意是2.0之后最新版本) yarn set version berry# 4、初始化 yarn yarn init # 5、装置我的项目所有依赖的js包 yarn # 或 yarn install三、更新 yarn 到最新版本yarn set version latest四、yarn 的命令# 查看所有命令 yarn help# 初始化,主动创立yarn运行必备文件 yarn init# 装置我的项目依赖的所有js包 yarn # 或 yarn install# 装置指定js包 yarn add [package] yarn add [package]@[version] yarn add [package]@[tag]# 更新指定js包 yarn up [package] yarn up [package]@[version] yarn up [package]@[tag]# 删除指定js包 yarn remove [package]五、参考链接yarn的装置与应用!

November 26, 2021 · 1 min · jiezi

关于yarn:yarn-安装依赖报错

yarn装置报错报错信息 error C:\Users\Acer\Desktop\react\node_modules\gifsicle: Command failed.Exit code: 1Command: node lib/install.jsArguments:Directory: C:\Users\Acer\Desktop\react\node_modules\gifsicleOutput:‼ getaddrinfo ENOENT raw.githubusercontent.com ‼ gifsicle pre-build test failed i compiling from source × Error: Command failed: C:\WINDOWS\system32\cmd.exe /s /c "autoreconf -ivf"'autoreconf' ���������ⲿ������ǿ����ij���网上百度,发现比拟少人遇到这个问题,感觉应该是本人本地环境有些问题,那有可能是本人本地环境有问题,而后就狐疑是本人装的yarn版本或者node版本不对,或者本人网络不好之类的,瞎猜,还从新把包删了重装之类,都没用,无头苍蝇。 其实问题还是本人教训太少了,记录一下,不便本人当前排查bug 首先程序报错了,不要慌,咱们应该先看报错信息,看下面信息说的是C:\Users\Acer\Desktop\react\node_modules\gifsicle这个文件夹上面的lib/install.js这个脚本外面有命令执行失败了,具体什么问题还不分明,所以应该去找到这个文件去看一下 install.js 'use strict';const path = require('path');const binBuild = require('bin-build');const log = require('logalot');const bin = require('.');(async () => { try { await bin.run(['--version']); log.success('gifsicle pre-build test passed successfully'); } catch (error) { log.warn(error.message); log.warn('gifsicle pre-build test failed'); log.info('compiling from source'); const config = [ './configure --disable-gifview --disable-gifdiff', `--prefix="${bin.dest()}" --bindir="${bin.dest()}"` ].join(' '); try { await binBuild.file(path.resolve(__dirname, '../vendor/source/gifsicle-1.92.tar.gz'), [ 'autoreconf -ivf', config, 'make install' ]); log.success('gifsicle built successfully'); } catch (error) { log.error(error.stack); // eslint-disable-next-line unicorn/no-process-exit process.exit(1); } }})();从这个文件中找一下,看看有没有本人能看懂,或者感觉有问题的,有的,就是这个gifsicle pre-build test failed,终端报错信息中就有这个,所以应该是bin.run(['--version'])这行代码有问题导致产生了这个报错,持续找,bin是require('.')引入进来的,对应的应该是同目录下的index.js,所以应该去看index.js文件的内容 ...

October 1, 2021 · 1 min · jiezi

关于yarn:your-network-connection-Retrying

生产服务器呈现问题: /data/cc/jenkins/workspace/workspace/new_ccas/ccas-ui+ yarnyarn install v1.22.11warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.[1/4] Resolving packages...[2/4] Fetching packages...info There appears to be trouble with your network connection. Retrying...info There appears to be trouble with your network connection. Retrying...info There appears to be trouble with your network connection. Retrying...info There appears to be trouble with your network connection. Retrying...error An unexpected error occurred: "https://registry.npmjs.org/@xview-ui/admin-core/-/admin-core-2.0.0.tgz: tunneling socket could not be established, cause=connect ECONNREFUSED 127.0.0.1:1080".而后通过:通过 yarn config get registry 确认,没有设置淘宝镜像。 ...

September 10, 2021 · 1 min · jiezi

关于yarn:升级Yarn-2摆脱nodemodules

node我的项目中最臭名远扬的莫过于node_modules文件夹,这个蹩脚的构造动辄使你的文件数目减少几万甚至几十万,无论是装置还是删除,都要耗费大量工夫,并且占据大量inode结点,咱们轻易进入一个react我的项目文件夹,看一下因为有node_modules会使你的我的项目中的文件个数变成多少: $ find . -type f | wc -l223629仅仅一个我的项目上面就有多达22万个文件。 当初咱们来看一下目前的yarn版本号是多少: $ yarn --version1.22.11嗯,目前yarn的版本号是1.22.11,那咱们如何装置yarn 2呢?答案是不须要装置,只须要设置就能够了。 $ yarn set version berry设置完了之后,咱们再来看一下yarn的版本号: $ yarn --version3.0.0不是说好的降级到yarn 2吗?怎么变成3.0了?不必恐慌,越高越好。 而后咱们来看一下我的项目文件夹下多了这么几个文件,首先就是根目录下多了一个.yarnrc.yml,外面只有一句话: yarnPath: .yarn/releases/yarn-berry.cjs相应的,还多了一个文件夹.yarn,外面有一个子文件夹releases,外面有一个文件yarn-berry.cjs,这几个文件就是全副yarn 2减少的内容了,这些内容不要在.gitignore里疏忽,其它的内容是须要疏忽的,当初咱们来在.gitignore里减少一些须要疏忽的内容: /node_modules/.pnp.pnp.js.pnp.cjs.yarn/cache.yarn/unplugged.yarn/install-state.gz接下来,咱们筹备利用新版的yarn装置咱们的依赖文件,在此之前,咱们须要先设置一下yarn库的镜像服务器以放慢整个下载过程: $ yarn config set npmRegistryServer https://registry.npm.taobao.org这时候,你再关上我的项目根目录下的.yarnrc.yml文件,会发现外面多了一行: npmRegistryServer: 'https://registry.npm.taobao.org'yarnPath: .yarn/releases/yarn-berry.cjs所以咱们晓得其实这个yarn config命令也没有什么特地的中央,只是通过它来批改.yarnrc.yml文件而已,你也能够通过间接批改.yarnrc.yml文件来达到同样的成果。 当初,咱们开始删除旧的node_modules文件夹和yarn.lock文件,并重建整个我的项目: $ rm -rf node_modules$ rm -f yarn.lock$ yarn整个下载过程应该还是比较顺利的,咱们来看一下我的项目文件夹中多了哪些文件: .yarn/cache.yarn/unplugged.pnp没有了node_modules文件夹,咱们来看一下.yarn/cache文件夹下有什么内容,外面有咱们之前依赖的node_modules文件夹下的所有依赖包,但不再是以目录的模式存在,而是变成了一个个zip文件,yarn 2就是利用我的项目根目录下的.pnp.cjs文件定位到这些zip文件以达到取代node_modules的作用,这样极大水平地缩小了我的项目中的文件个数。 上面咱们开始启动我的项目: yarn start十有八九你的我的项目这时候是启动不起来的,不要慌,这篇文章通知你所有的解决办法。 首先,你遇到谬误可能是这样: Error: Your application tried to access terser-webpack-plugin, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.具体内容可能不一样,但你要留神这个关键词Your application,这阐明是你的代码当中的某个地位援用了前面的插件,但你没有在package.json文件中显式申明它,那为什么之前用yarn 1或者npm的时候没有这个问题呢?因为以前是有node_modules文件夹的,所有依赖包都被平摊在这个文件夹中,即便是被其它依赖的依赖引入的,它也会被开释在node_modules根目录下,所以node能够很轻松地找到它,而当初这个文件夹没有了,咱们必须显式地在package.json文件中援用它,能力疏导yarn找到这个依赖项。因而,解决这种Your application不足某个依赖项的办法很简略,咱们只须要用yarn装置它就能够了: ...

August 16, 2021 · 1 min · jiezi

关于yarn:yarnnpmcnpm-命令

yarn、npm、cnpm 命令 // 装置依赖到开发环境yarn add xxxnpm install xxx --save// 装置依赖到生产环境yarn add xxx -Dnpm install xxx --save-dev// 装置依赖到全局yarn global add xxxnpm install xxx -g// 更新依赖到某版本yarn upgrade xxx@v1.1.0npm install xxx@v1.1.0// 更新依赖到最新版本yarn upgrade --latest// 删除依赖yarn remove xxxnpm uninstall xxx// 运行scripts脚本 yarn run dev npm run dev// 查看版本yarn -vnpm -v// 列出所有依赖yarn listnpm list

July 26, 2021 · 1 min · jiezi

关于yarn:使用yarn构建离线nodemodules镜像

1、装置yarn npm install -g yarn2、⾸先咱们须要设置⼀个⽬录作为咱们的“离线镜像”存储,咱们能够通过yarn config 命令来实现 yarn config set yarn-offline-mirror ./npm-packages-offline-cache之后会在以后项⽬门路⽣成⼀个npm-packages-offline-cache ⽂件夹⽤来寄存构建的.tgz离线⽂件 3、挪动配置⽂件到项⽬门路,以便离线镜像仅⽤于此项⽬ mv ~/.yarnrc ./4、删除之前的node_modules和yarn.lock并从新构建 yarn install构建胜利后在npm-packages-offline-cache能看到.tgz压缩⽂件 5、离线装置node_modules yarn install --offlline离线装置中途可能会报错,其实是执⾏某些脚本时须要更新,然而因为是离线,⽆法更新,可疏忽,在有⽹络条件下不会呈现该状况。 在理论项⽬中只须要咱们曾经构建好的npm-packages-offline-cache、yarn.lock、.yarnrc ,而后执⾏离线构建命令即可代替原来的npm install操作。

July 18, 2021 · 1 min · jiezi

关于yarn:Monorepo-中的任务调度机制

前言Monorepo 中的一个我的项目称为 project,对 project 进行的具体操作称为工作 task,比方 build 或 test,能够广义地了解为 npm scripts 中注册的操作,Monorepo 管理工具该当有能力调度这些工作。 先看一个 ,如上图所示,存在一个依赖关系较为简单的 Monorepo,此时须要执行某个工作,例如 build,如何同时保障工作执行程序以及工作执行效率(假如最大工作并行数为 N)? 接下来就是枯燥乏味的做题过程,咱们先把下面那张我的项目依赖图形象成代码。 问题interface Project { name: string; actions: { name: string; fn: () => Promise<void> }[]; dependencyProjects: Project[];}const sleep = (s: number): Promise<void> => new Promise((r) => setTimeout(r, s));// Monorepo 中注册的所有我的项目const projects: Project[] = [ "@monorepo/a", "@monorepo/b", "@monorepo/c", "@monorepo/d", "@monorepo/x", "@monorepo/y", "@monorepo/z",].map((name) => ({ name, actions: [{ name: "build", fn: () => sleep(Math.random() * 1000) }], dependencyProjects: [],}));const [A, B, C, D, X, Y, Z] = projects;A.dependencyProjects = [B];B.dependencyProjects = [D];C.dependencyProjects = [D, X, Y];X.dependencyProjects = [Y, Z];/** * 实现本办法,使得 build 行为依照正确的程序执行,且保障执行效率 * @param projects 须要执行工作的 project 汇合 * @param actionName 具体操作名称 * @param limit 工作最大并行数 */function run(projects: Project[], actionName: string, limit: number) { // todo}run(projects, "build", 12);解题很显著,project 之间存在依赖关系,那么工作之间也存在依赖关系,那么能够失去以下论断: ...

July 5, 2021 · 4 min · jiezi

关于yarn:yarn全局安装后命令为何不能使用

npm全局装置 npm i -g xxxyarn 全局装置 yarn global add xxx然而你可能会发现npm全局装置后的命令能够间接应用,而yarn却不行,这是为什么呢? 咱们来查看下npm和yarn的bin目录 bin是binary的缩写,意思是寄存二进制可执行文件的目录,比方exe,msi,cmd等,而npm,yarn全局装置的命令就会从这外面开始查找可执行文件。 那为什么零碎会从这个门路下进行查找可执行文件呢?这就要说下环境变量 简略的说计算机在执行命令的时候是在环境变量找对应的命令的地位的。如果不正确设置环境变量就不能正确应用相应的命令。如果执行某个命令,零碎无奈在以后文件夹里找到对应的.exe(可执行文件),那么零碎就会去环境变量path蕴含的门路找挨个找看是否能晓得对应的.exe,一旦找到第一个对应的.exe就运行命令,其余的门路下就不找了。如果找不到你就会看到“零碎找不到某某命令”的提醒。 在装置node的过程,装置过程会主动的减少node和npm的门路到环境变量,如下图: 所以咱们应用npm装置的全局命令,能够间接应用,无需再配置环境变量。 关上bin目录能够发现全局装置的命令脚本或者可执行文件 留神:应用cnpm装置的yarn,如果要卸载,须要应用npm卸载,cnpm卸载不了,卸载实现,须要重启命令行工具。然而yarn的bin目录门路不会增加到环境变量中,这也就是为什么yarn全局装置后命令不能应用的起因。 因而,全局装置命令行工具库最好应用npm或者cnpm,不倡议应用yarn。可能有同学会说手动将yarn的bin目录门路增加到环境变量中不就能够了吗?但如果npm和yarn都装置了同一个命令行工具库,然而版本不一样,那在执行命令的时候应该去执行哪一个命令脚本呢? 或者你能够在yarn的bin目录执行脚本命令文件,如下: cd C:\Users\cassmall\AppData\Local\Yarn\bineslint --fix --ext .ts /src参考文章:yarn如何全局装置命令以及和环境变量的关系

June 7, 2021 · 1 min · jiezi

关于yarn:Yarn工作区

本节咱们学习 Yarn 工作区,什么是工作区呢? 工作区是设置软件包体系结构的一种新形式,默认状况下从 Yarn 1.0 开始应用。咱们能够应用这种形式装置多个软件包, 也就是只须要执行一次 yarn install 命令便能够将所有依赖包全副装置。 如何应用工作区在 package.json 文件中增加以下内容,接下来咱们将此目录称为 “工作区根目录”: { "private": true, "workspaces": ["workspace-a", "workspace-b]}其中 private:true 是必填项,工作区并不是要公布的,因为增加了此安全措施来确保没有任何货色能够意外地裸露它们。 创立这个文件之后,咱们须要在创立两个新的子文件夹:workspace-a 和 workspace-b。在每个文件夹外面,创立一个具备以下内容的 package. json 文件: workspace-a/package.json: { "name": "workspace-a", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5" }}workspace-b/package.json: { "name": "workspace-b", "version": "1.0.0", "dependencies": { "cross-env": "5.0.5", "workspace-a": "1.0.0" }}最初能够在工作区根目录中执行 yarn install 命令,如果一切正常,当初应该有一个相似上面这样的文件层次结构: /package.json/yarn.lock/node_modules/node_modules/cross-env/node_modules/workspace-a -> /workspace-a/workspace-a/package.json/workspace-b/package.jsonworkspace-b 须要一个在 workspace-a 中的文件,当初将间接应用以后我的项目外部的文件,而不是从 Github 下面获取。cross-env 包已正确去重并放在我的项目的根目录下,让 workspace-a 和 workspace-b能够一起应用这个包。 限度和正告包层级在工作区和用户失去的内容之间将有所不同(工作区依赖将晋升到文件系统层次结构中)。 对这个层级的假如曾经是危险的,因为晋升过程不是标准化的,所以实践上没有什么新货色。在下面的示例中,如果 workspace-b 依赖于 workspace-a 的包,然而援用的是不同的版本,那么依赖包将从 Github 装置,而不是从本地文件系统链接。 这是因为一些软件包实际上须要应用以前的版本,以建设新的版本(Babel 是其中之一)。在工作区中公布包时要留心。 如果你正筹备公布下一个版本,并且你决定援用一个新依赖但忘了在 package.json 中申明,你的测试仍可能在本地通过(如果其余包曾经把那个援用下载到了我的项目根目录)。 然而其余从源中拉取包的用户就不行了,因为依赖列表当初是不残缺的,他们没方法下载那个新依赖。 目前没有方法在这种状况下抛出正告。工作区必须是我的项目根目录的子目录,咱们不能也不该当援用位于我的项目目录之外的工作区。工作区不反对嵌套。链接:https://www.9xkd.com/ ...

April 23, 2021 · 1 min · jiezi

关于yarn:Yarn依赖与版本

本节咱们来讲 Yarn 中的依赖与版本。软件包依赖关系对于包的胜利是至关重要的,当开发软件包时,咱们可能会用到其余包里的现有代码来开发本人的软件包性能,那么其余包就能够称为我的项目的依赖项。 所有的我的项目依赖都在 package.json 文件中申明,每个依赖项都须要指名依赖名称和最低版本信息。而 yarn.lock 文件里保留了每个依赖的装置版本,来确保软件包在所有装置过程中保持一致。 依赖的类型不同的依赖有着不同的目标,在构建我的项目时须要一些依赖项,在运行程序时也须要一些依赖项,因为有不同的依赖类型。 对于 package.json 文件能够蕴含的一些依赖类型如下所示: { "name": "my_yarn", "dependencies": { "package-a": "^1.1.0" }, "devDependencies": { "package-b": "^1.2.1" }, "peerDependencies": { "package-c": "^2.5.4" }, "optionalDependencies": { "package-d": "^3.1.0" }}dependencies:惯例依赖,也就是运行代码时所需的依赖项。devDependencies:开发依赖,在开发工作流中某些时候须要的依赖关系,而在运行代码时则不须要。peerDependencies:伙伴依赖,一种非凡类型的依赖项,只有在公布本人的程序包时才会呈现。optionalDependencies:可选依赖,这种依赖即使装置失败,Yarn 也会认为整个依赖装置过程是胜利的。bundledDependencies:打包依赖,在公布包时,这个数组里的包都将会被打包(bundle)。依赖的版本Yarn 的软件包恪守语义版本控制,也叫作 “semver",也就是说当咱们从资源库装置一个新包,它会和语义版本范畴一起被增加到咱们的 package.json 文件中。 版本号能够划分为 主版本号.次版本号.订正号,相似于 1.0.0、1.1.2,不同的状况对应不同的版本号增长,如下所示: 主版本号:新的版本不兼容老版本的 API。次版本号:新的版本新增了局部性能并向下兼容。订正号:新的版本修复局部 bug 并向下兼容。有些时候,除了版本号当前还会呈现一些特殊字符,例如 >=,<,^ 和 ~ ,这些是运算符,能够用来指定版本范畴。版本范畴的用途是表明依赖的哪个版本会在代码中起作用。举个例子,像 >2.1.0 示意大于 2.1.0 版本、=4.3.1 示意等于 4.3.1 版本。如果不指定运算符,则示意等于某个版本。 选择性依赖项解决Yarn 反对选择性版本解析,package.json 文件里的 resolutions 字段用于解析选择性版本,能够通过此性能自定义依赖版本。这通常须要在 yarn.lock 文件中进行手动编辑。 示例: 在 package.json 文件中增加一个 resolutions 字段用于笼罩版本定义: ...

April 19, 2021 · 1 min · jiezi

关于yarn:如何发布Yarn包

本节咱们来学习如何公布 Yarn 包,如果咱们心愿通过 Yarn 共享咱们创立好的包给全世界各地的其余开发者,能够将软件包托管到一个可信赖的网站上。 创立软件包 首先咱们须要创立一个软件包,能够通过下列几个命令来创立,如下所示: > git init my_yarn> cd my_yarn> yarn init看一下这几个命令的执行成果:其中 git init my_yarn 命令将会初始化创立一个新本地仓库,它在工作目录下生成一个名为 .git 的暗藏文件夹。而后应用 cd my_yarn 命令跳转到指定目录中,通过 yarn init 初始化一个新的我的项目。在执行 yarn init 时会呈现一些问题,依据需要为每个问题输出答案,最终会在根目录下生成一个 package.json 文件。如果想要对所有的问题都应用默认值,能够间接运行 yarn init --yes 命令。 此时 package.json 文件的内容相似上面所示,当然依据输出答案的不同,内容也会有所不同: <pre spellcheck="false" class="md-fences md-end-block contain-cm modeLoaded" lang="json" contenteditable="false" cid="n18" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 0.9em; white-space: normal; display: block; break-inside: avoid; text-align: left; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(223, 226, 229); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">{ "name": "my_yarn", "version": "1.0.0", "main": "index.js", "author": "Your Name <you@example.com>", "license": "MIT"}</pre> ...

April 16, 2021 · 1 min · jiezi

关于yarn:Yarn-yarnlock文件

为了在多台机器之间取得统一的装置后果,Yarn 可能会须要比 package.json 文件中配置的依赖项更多的信息。它须要精确存储每一个依赖项的装置版本。因而在 Yarn 我的项目的根目录咱们须要一个 yarn.lock 文件,这个 yarn.lock 文件是主动生成的。 当咱们执行 yarn 命令或者增加依赖包命令后,Yarn 都会在我的项目根目录下主动生成一个 yarn.lock 文件。在应用 Yarn 装置、降级、删除依赖我的项目时,会自动更新到 yarn.lock 文件中。个别咱们不会去手动编辑这个文件,因为很容易毁坏这个文件。 示例:例如咱们装置了一些依赖包,那么 yarn.lock 文件内容相似所示格局: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0"能够显著看到 yarn.lock 文件中的信息比 package.json 文件中具体了很多。 在理论我的项目中,yarn.lock 文件也很有用途,咱们能够将 yarn.lock 提交到版本库中,其余成员就能够通过 yarn install 获取所有依赖包,这个能够保障大家装置的依赖是完全一致的,防止产生 bug。

April 14, 2021 · 1 min · jiezi

关于yarn:Yarn安装

本节咱们来学习 Yarn 的装置,在应用 Yarn 之前,咱们须要先装置 Yarn。而装置 Yarn 的形式有多种,例如下载安装程序、通过 Chocolatey 装置、通过 Scoop 装置等,大家能够抉择一种适宜本人的形式装置。 下载 Yarn首先咱们须要关上官网:https://www.yarnpkg.com/lang/en/,能够看到如下所示页面:而后点击页面中的 INSTALL YARN 按钮,会跳转页面,如下图所示:在这个页面中,咱们能够抉择操作系统,例如我应用的是 Windows零碎,所以默认抉择 Windows 版本即可。大家能够依据须要抉择,会默认抉择最新的稳固版本。选好版本后,接着点击 Download Installer进行下载 ,会胜利下载一个 .msi 安装包。 开始装置 Yarn下载实现后,点击安装包就能够开始装置了,会看到如下所示界面,间接点击 Next 按钮,进入下一步:这一步骤中,须要勾选批准协定,能力持续下一步:而后是 Yarn 的装置门路,能够抉择默认门路,也能够本人批改装置门路,持续点击 Next 进入下一步:而后就能够开始装置啦,只须要点击 Install 按钮就会开始装置:装置胜利后的界面如下所示: 最初咱们能够在命令行中通过 yarn --version 命令查看 Yarn 的版本,如果呈现版本号,则示意装置胜利,下图中显示咱们胜利装置了 v1.22.4 版本的 Yarn。 应用npm来装置Yarn如果咱们曾经下载了 Node.js ,那么咱们能够通过 npm 来装置 Yarn,命令如下所示: npm install -g yarn上述命令中的 -g ,示意全局装置。Yarn 装置好后,同样能够通过 yarn --version 命令来查看版本号,呈现版本号则示意装置胜利。 总结本节咱们讲了如何下载安装 Yarn,能够通过在官网下载一个 .msi 安装包文件,而后依据提醒进行装置。也能够通过 npm 来装置 Yarn,须要下载一个 Node.js 。还有其余的装置形式,这里就不一一解说啦,大家如果想理解能够本人去官网看一下。 ...

April 6, 2021 · 1 min · jiezi

关于yarn:Yarn简介

本教程咱们来学习 Yarn,Yarn 是 Yet Another Resource Negotiator 的简写,能够译为另一种资源协调者,也就是资源管理器。 Yarn 是由 Facebook 、Google、Exponent 、Tilde 联合推出的一个新的 Javascript 包管理工具,它的呈现次要是为了补救 npm 的一些缺点。 官网上介绍了 Yarn 的一些劣势,例如 : 速度超快:Yarn 缓存了每个下载过的包,所以再次应用时无需反复下载。 同时利用并行下载以最大化资源利用率,因而装置速度更快。超级平安:在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级牢靠:应用具体、简洁的锁文件格式和明确的装置算法,Yarn 可能保障在不同零碎上无差别的工作。Yarn的个性离线模式:如果你以前装置过某个包,再次装置时能够在没有任何互联网连贯的状况下进行。确定性:不论装置程序如何,雷同的依赖关系将在每台机器上以雷同的形式装置。网络性能:Yarn 无效地将申请排序,防止申请沉积,以最大限度地进步网络利用率。多个注册表:无论从 npm 或 Bower 装置任何包,能放弃包工作流程雷同。网络复原:单个申请失败不会导致装置失败,申请在失败时会主动重试。立体模式:将不兼容版本的依赖项解析为单个版本,以防止创立反复项。Yarn三大组成构件ResourceManager:负责整个集群的资源管理和调配,是一个全局的资源管理零碎。NodeManager:是每个节点上的资源和工作管理器,它是治理这台机器的代理,负责该节点程序的运行,以及该节点资源的治理和监控。Yarn 集群每个节点都运行一个NodeManager。ApplicationMaster:用户提交的每个应用程序均蕴含一个 ApplicationMaster,能够运行在 ResourceManager 以外的机器上。Yarn运行流程用户向 Yarn 中提交应用程序,其中包含 ApplicationMaster 程序,启动 ApplicationMaster 的命令、用户程序等。ResourceManager 为这个应用程序调配第一个 Container,在 Container 中运行一个ApplicationMaster。ApplicationMaster 首先向 ResourceManager 注册,这样用户就能够间接通过它本身查看利用长须的运行状态,而后它将为各个工作申请资源,并监控它的运行状态,直到运行完结。ApplicationMaster 采纳轮询的形式通过 RPC 协定向 ResourceManager` 申请和支付资源。一旦 ApplicationMaster 申请到资源后,便与对应的 NodeManager 通信,要求其启动工作。NodeManager 为工作设置好运行环境(包含变量、JAR包、二进制程序等)后,将工作启动命令写到一个脚本中,并通过运行该脚本启动工作。各个工作通过某个 RPC 协定向 ApplicationMaster 汇报本人的状态和进度,以让 ApplicationMaster 随时把握各个工作的运行状态,从而能够在工作失败时重新启动工作。在利用程序运行过程中,用户能够随时通过 RPC 向 ApplicationMaster 查问应用程序的以后运行状态。利用程序运行实现后,ApplicationMaster 向 ResourceManager 登记并敞开本人。总结Yarn 也是一个包管理工具,能够用来代替 npm。比照 npm 有如下区别: ...

March 30, 2021 · 1 min · jiezi

关于yarn:工程化之Yarn

yarn打包 yarn install //yarn add -g caniuse-liteyarn run buildcd distzip -r dist.zip *

March 29, 2021 · 1 min · jiezi

关于运维自动化:带你轻松了解任务运维和数据指标相关的使用

一、实时开发常见问题 1、一个实时计算工作该调配多少资源? 倡议:一些简略ETL工作,并且源数据流量在肯定范畴内, tm个数1、全局并行度1、内存1G。 剖析: 全局并行度为1,对于简略ETL工作会有operator chain,在一个task(线程)中运行、缩小线程切换、缩小音讯序列化/反序列化等,该类问题的瓶颈个别在上游写入端。写入端是瓶颈:个别倡议开启批量写入(须要管制批量大小,避免内存溢出)、开启多并行度写入。如果是单台数据库的瓶颈:开启多个并行度就没法晋升性能、个别倡议依照肯定路由规定写入多台数据库、倡议应用分布式数据库(如Hbase:提前建设分区、防止数据热点写入等)。2、为什么写入Kafka后果中有些分区没有数据? 倡议:如果现有topic曾经存在,并且是多个分区,后果表并行度设置partition数一样。剖析: 因为Flink写Kafka默认采纳的是FixedPartitioner。如果并行度比partition大,则数据都会发送到partition中,然而如果并行度比partition小,则有局部分区是没有数据的。source端,如果并行度小于partition,会取模的形式分给并行度,都会生产到数据。如果并行度大于partition,则会有局部task生产不到数据。3、为什么和维表关联后工作解决数据的能力变慢? 倡议:小数据量不常更新的维表应用ALL模式。大数据量的维表应用应用LRU模式,并且依据数据库不同做相应的解决(比方关系型数据库则建设索引等)。 剖析:1.ALL模式启动时候间接将数据全量加载到内存中,每次关联数据不须要查库,没有其余开销。2.异步(async)查问模式 LRU异步查询数据库,能够并发地解决多个申请。依据SQL中的关联字段程序建设复合索引。避免关联字段索引生效(关联程序不对、关联列做计算等)。如果维表字段个数少,思考将将多余字段都退出到索引中,缩小回表(带来的问题是索引变大)。4、为什么某些工作进步并行度能晋升性能,某些不能? 倡议:查看是否数据歪斜,如果是将数据打散。 剖析: 源头是否数据歪斜。SQL中是否存在导致歪斜的语句。登陆到Flink web页面查看。通过批改SQL解决或者打散groupby字段。二、实时工作运维 1、配置反压告警 场景:反压导致cp失败,数据呈现提早或者不产出。 排查办法:1)借助Flink web-ui 提供的的反压性能查找具体的operatorChain。2)查问Flink metric 'inPoolUsage、outPoolUsage' 来确定具体的反压算子。 2、配置cp失败告警 场景:cp失败导致数据无奈真正落地,工作复原距离太长。 排查办法: 1)是否存在反压。2)查看集群负载、IO、CPU、MEM 是否处于高负荷状态。 3、拆分实时工作日志 场景: Flink实时工作运行工夫长之后导致日志占用磁盘大,另外一个大的日志文件不利于排查问题。 解决办法: 配置log4j.log的滚动参数,设置日志按日期或者大小滚动生产,并且限度保留的大小。 4、监控工作运行中tm日志 场景: 工作执行中产生的运行日志没有监控,比方网络抖动导致的链接失败等等。 解决办法: 批改Flink自带的log4j jar包中的代码,将异样日志重定向一份到Kafka或ES中,进行后续剖析,找到程序中可能存在的暗藏bug。 5、脏数据管理 场景:因为数据源都是从Kafka过去的数据,可能存在数据类型谬误、字段名称谬误、字段阈值在Flink中超范围等。落库过程中,因为字段类型不匹配、阈值超范围等等状况。 解决办法: 在数据解析和数据落库等代码中,对catch中的数据进行收集。当异样数据达到肯定的量时,告警告诉。线下离线修改后果数据。 三、通过Metrics定位问题 1.罕用内置Metrics介绍 端到端的延时(最大、均匀、百分位): flink_taskmanager_job_latency_source_id_operator_id_operator_subtask_index_latency 输出数据量: flink_taskmanager_job_task_operator_numRecordsIn flink_taskmanager_job_task_numBytesIn 输入数据量: flink_taskmanager_job_task_operator_numRecordsOut flink_taskmanager_job_task_numBytesOut 反压值: flink_taskmanager_job_task_isBackPressured 工作buffer: inPoolUsage、outPoolUsage等其余 2、flinkStreamSql中罕用metrics 业务提早: flink_taskmanager_job_task_operator_dtEventDelay(单位s) 数据自身的工夫和进入flink的以后工夫的差值。 各个输出源的脏数据: flink_taskmanager_job_task_operator_dtDirtyData 从Kafka获取的数据解析失败视为脏数据。 各Source的数据输出TPS: flink_taskmanager_job_task_operator_dtNumRecordsInRate Kafka承受的记录数(未解析前)/s。 各Source的数据输出RPS: ...

March 18, 2021 · 1 min · jiezi

关于yarn:yarn-中国镜像代理

yarn config set registry https://registry.npm.taobao.org --globalyarn config set disturl https://npm.taobao.org/dist --global

February 16, 2021 · 1 min · jiezi

关于yarn:lerna-workspaces使用手册

lerna项目管理形式固定模式默认的模式版本号应用lerna.json文件中的version属性。 执行lerna publish时,如果代码有更新,会自动更新此版本号的值。即:所有的包公用一个版本号 应用形式:lerna init 独立模式容许保护人员独立的减少批改每个包的版本,每次公布,所有更改的包都会提醒输出指定版本号。应用形式:lerna init --independent 或 批改lerna.json中的version值为independent,可将固定模式改为独立模式运行。 初始化我的项目lerna提供一种集中管理package的目录模式,提供了一套自动化管理程序git init lerna-demo & cd $_ npm i -g lerna lerna init // 初始化后目录构造|—— packages // 空目录|—— lerna.json|—— package.json配置文件lerna.json{ "npmClient": "yarn", // 执行命令所用的客户端,默认为npm —— 配置后会强制应用最佳实际:能用yarn的用yarn——如lerna bootstap --hoist不再可用 "command": { // 命令相干配置 "publish": { // 公布时配置 "allowBranch": "master", // 只在master分支执行publish "conventionalCommits": true, // 生成changelog文件 "exact": true, // 精确的依赖项 "ignoreChanges": ["ignored-file", "*.md"], // 公布时疏忽的文件 "message": "chore(release): publish" // 公布时的自定义提醒音讯 }, "bootstrap": { // 装置依赖配置 "ignore": "component-*", // 疏忽项 "npmClientArgs": ["--no-package-lock"], // 执行 lerna bootstrap命令时传的参数 "hoist": true }, "version": { "conventionalCommits": true //开启日志:主动生成changLog.md } }, "packages": [ // 指定寄存包的地位 "packages/*" ], "version": "0.0.0" // 以后版本号}启用workspaces环境手动批改根目录下package.json ...

January 26, 2021 · 1 min · jiezi

关于yarn:yarn-安装包时出现错误

error An unexpected error occurred: "https://registry.npm.taobao.org/egg: tunnel ing socket could not be established, cause=getaddrinfo ENOTFOUND 9999猜想起因: 本机有proxy工具解决办法: yarn config set proxy http://localhost:portyarn config set https-proxy http://localhost:port减速办法: yarn config set registry https://registry.npm.taobao.org --global// 查看配置yarn config list

September 18, 2020 · 1 min · jiezi

为什么我们从Yarn切换到pnpm

原文网址:https://www.takeshape.io/arti...原文作者:ANDREW SPROUSE 这是一个重大的决定 在 TakeShape,我们非常关注开发人员的生产力。 我们是一个资源有限的小型团队,因此值得花时间考虑如何更快,更高效地合作。 在最近重构我们的构建过程时,我们做出了一个重大决定:我们将抛弃 Yarn 并改用 pnpm 来管理我们的依赖项并运行我们的脚本。 这是关于我们如何做出该决定以及迄今为止如何使我们受益的故事。 最初,TakeShape 的代码库分散在多个Git存储库中。 每个软件包都是独立开发的,并且彼此依赖。 从理论上讲,这是理想的设置。 在实践中,我们发现所有东西都是相互依赖的,我们真的希望能够同时测试和发布所有软件包。 当我们为其中一个软件包发行新版本时会遇到失败,但是会忘记在依赖它的其他项目中更新该版本。 最终,我们意识到,在保持项目的分离性和依赖性时,monorepo 是正确的权衡。 我们所有的软件包(如Web客户端,前端路由库和CLI)都存在一个可测试且可部署的单元中。 我们的包可以使用package.json 中的 link :语法相互依赖。 这在很大程度上是有效的,但是我们仍然发现管理我们的 monorepo 的部分是乏味的。这在一定程度上是因为我们的 monorepo 中的每个包都用自己的包管理器管理自己的依赖关系,json和它自己的lock 文件。即使每个包使用相同的开发工具链,如eslint、Jest、Typescript和Babel,每个包单独声明这些 devdependency ,这个工具链必须在我们所有的包中保持最新。我们决定不使用Yarn的工作区特性来解决这个问题,因为这将需要抛弃每个包的lock文件,而使用单个工作区范围的lock文件。 避免幻像依赖也比实际需要更加棘手。 当您的代码导入未在 package.json 中声明的包时,就会产生幻像依赖。 假设您将 Package A 添加到依赖于 Package B 的项目中。由于 Yarn 将所有程序包都保留在 node_modules 的根目录下,因此您可以导入和使用 Package B ,而无需将其完全放在 package.json 中。 尽管不是很常见,但这是一个错误的做法,它确实会减慢调试过程的速度,除非您记得有意地检查它。 我们的 monorepo 也使我们的CI管道比所需的更加复杂。 首先,我们并行化了 CircleCI 构建,以加快慢速 Webpack 构建。 但是,随着我们的 monorepo 的增长,为每个构建分别安装依赖项的开销也在增加。 为每个构建安装依赖项成为瓶颈。 作为回应,我们使用自己编写和维护的 CircleCI 脚本巩固了构建过程,以减少使用工作。最终,我们得到了一组脆弱的CI脚本来对任何包进行剪裁、测试和构建更改。 ...

July 8, 2020 · 1 min · jiezi