精华内容
下载资源
问答
  • 2022-04-14 14:21:59

    前言

    平时使用手机和电脑下载软件的时候,都存在一个方便的应用商店。

    对于程序员来说,日常开发会使用到各种不同的环境包和工具,那么这些东西除了从各个工具的官网下载,能不能从应用商店下载到?

    答案是一般不能,因为这些东西不是一般普通人经常使用的软件,所以应用商店不会上这些软件,导致大家不能搜到这些软件。

    由于以上相关需求的推动,诞生了homebrew,官方介绍:macOS(或 Linux)缺失的软件包的管理器。

    步骤

    1.访问官网

    macOS(或 Linux)缺失的软件包的管理器 — Homebrew

    2.在终端执行

    官方推荐:

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

    国内由于网速限制,需要替换镜像源,使用中科大镜像加速访问,建议先用官方的,不行再使用这个

    /usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"
    

    3.安装以后的基本配置概念

    (1)Homebrew主要由四部分组成,分别提供下载不同类型的文件功能

    名称说明
    brew Homebrew源代码仓库
    homebrew-coreHomebrew核心软件仓库
    homebrew-bottlesHomebrew预编译二进制软件包
    homebrew-cask MacOS客户端应用

    (2)下载软件的时候,由于不同地区的网速问题,homebrew提供了命令,可以替换默认地址为对应国内的镜像源,可以提高下载速度。

    由于镜像源可能存在变化的可能,所以这里不写这部分教程,具体替换可以网上搜索关键词:homebrew镜像源替换

    (3)使用homebrew的目的,就是让homebrew帮忙管理软件的下载、管理和卸载等生命周期,用户直接关注使用软件本身就行了,提高了效率,所以homebrew下载后的软件地址,不要轻易移动,防止出现各种问题,一般在隐藏目录/usr/local下面

    4.homebrew经常使用的命令

    //查询所有命令
    brew --help
    // 查询软件
    brew search 软件名
    // 查看软件信息
    brew info 软件名
    // 安装软件
    brew install 软件名
    // 卸载软件
    brew uninstall 软件名

    更多相关内容
  • 谈谈前端包管理工具 npm & yarn & pnpm

    万次阅读 2022-03-12 17:20:46
    为什么需要包管理工具? 每种主流编程语言都有包管理工具,比如 java 的 Maven、Gradle,Python 的 pip,nodejs 的 npm、yarn、pnpm 等。 包管理工具的主要作用是管理第三方依赖,也可以看成一个"轮子"工厂,每个人...

    为什么需要包管理工具?

    每种主流编程语言都有包管理工具,比如 javaMavenGradlePythonpipnodejsnpmyarnpnpm 等。
    包管理工具的主要作用是管理第三方依赖,也可以看成一个"轮子"工厂,每个人都可以上传自己造的"轮子"和下载使用别人的"轮子",
    包管理工具顾名思义就是统一管理这些轮子的软件或者工具,它以多种方式自动处理项目依赖关系、提供了命令行工具(CLI)、支持跟踪依赖项和版本等功能,
    除此之外还可以安装、卸载、更新和升级包,配置项目设置,运行脚本等等。
    有了包管理工具,我们可以很简单地构建一个项目或者引入和管理一个库,留给我们的则是愉快地编码。

    npm 不只是包管理工具,它是世界上最大的软件注册表(registry),每星期大约有 30亿次 的下载量,包含超过 600000个包,开发者使用 npm 互相分享和借鉴。

    版本管理规范

    版本管理规范 - 语义化版本控制规范 SemVer

    在这里插入图片描述

    在使用 npmyarn 安装完依赖时,package.json 会有类似以下的版本号:

    "vue": "^2.6.11",
    "vue-router": "~3.1.3"
    

    2.6.113.1.3 这个版本号就是遵循了 SemVer 语义化版本控制的规范。

    SemVer规范规定,版本的格式为:主版本号.次版本号.修订号-预发版本(可选),版本号递增规则如下:

    1. 主版本号:当你做了不兼容的 API 修改
    2. 次版本号:当你做了向下兼容的功能性新增
    3. 修订号:当你做了向下兼容的问题修正。
    4. 预发布版本:
      • alpha(Alpha 版本,通常用于进行中的工作和实验)
      • beta(Beta 版本,通常是下一个计划发布的功能完整的版本,但可能包含已知错误)
      • rc: 候选版本,通常是可能最终(稳定)的版本,除非出现重大错误。

    在 nodejs 版本管理中,还允许使用 ~ ^ * 字符来管理版本的范围:

    • ^: 不允许修改最左边非0版本 (^2.6.11: 版本 >= 2.6.11 且 < 3.0.0)
    • ~: 如果指定了次要版本,则只允许补丁版本更新,如果没有,则允许次要版本更新 (~3.1.3: 版本 >= 3.1.3 且 < 3.2.0)
    • *: 任何非预发版本 (版本 >=0.0.0)

    前端主流包管理工具

    主流的前端包管理工具有 npmyarnpnpm、以及国内的镜像 cnpmtyarn 等,这是包管理器都是基于 nodejs

    npm 是 2010 年发布的 nodejs 依赖管理工具,在此之前,前端的依赖管理都是手动下载和管理的。

    yarn 是 Facebook 于 2016 年 发布的替代 npm 的包管理工具,还可以作为项目管理工具,定位是快速、可靠、安全的依赖管理工具。

    pnpm 是 2017 年发布的一款替代 npm 包管理工具,具有速度快、节省磁盘空间的特点。

    bd4df328d6324a94b12aefd0bf892687_tplv-k3u1fbpfcp-zoom-in-crop-mark_1304_0_0_0.png

    2010:npm 发布,支持 Node.js。
    2016:yarn 发布,生成 yarn.lock 文件用于确定 repos 的精确版本,并且比 npm 性能更好。
    2017:npm 5 发布,提供类似 yarn.lock 的 package-lock.json 文件。
    2017:pnpm 发布,pnpm 具有 yarn 相对于 npm 的所有附加功能,并解决了 yarn 没有解决的磁盘空间问题。
    2018:npm 6 发布,在 npm 在安装依赖项之前检查安全漏洞,提高了安全性。
    2020:yarn 2 和 npm 7 发布,这两个软件包都具有出色的新功能。
    2021:yarn 3 发布并进行了各种改进。
    

    yarn vs npm vs pnpm

    包管理工具安装和版本切换

    因为 node 预装了 npm ,所以安装 node 后,不需要手动安装 npm

    相反地,yarn 需要手动安装。建议全局安装 yarn

    npm install yarn -g
    

    然后,我们在项目的根目录设置需要的 yarn 版本:

    # yarn set version latest # 最新版
    # yarn set version canary # 最新的经典版
    # yarn set version classic # 最新的经典版
    # yarn set version 3.x
    yarn set version <version>
    

    使用 Yarn,在每个项目我们可以使用不同的版本,而在 npm 中,要安装 nvm 才能完成版本切换。

    同样的,pnpm 也需要全局安装,才能使用

    npm install pnpm -g
    

    pnpm 其他使用命令npm 使用方法一致。

    安装项目依赖

    在执行 npm install 安装项目依赖时,依赖项是顺序安装,并且终端会输出很多的警告日志,导致覆盖报错的日志,从而难以排查问题。

    使用 yarn 安装依赖时,运行 yarn 命令即可,yarn 是并行安装依赖项,这是它比 npm 快的原因之一,yarn 1 中的日志比较简介干净,是以树形的形式显示,但是在 yarn 2yarn 3 中日志发生了变化,并不像以前直观。

    并且,yarn 还支持离线安装,只要以前装过的包,可以在没有网络链接的情况下进行。yarn 具有重试机制,单个包安装失败不会导致整个安装失败。

    yarn 安装不同版本的依赖时,会将多个版本归结为单个版本,避免创建多个副本。

    npmyarnpnpm 常用命令

    • npm init| yarn init| pnpm init: 初始化命令

    • npm run| yarn run/yarn | pnpm: 运行脚本

    • npm publish| yarn publish: 发布包

    • npm cache clean| yarn cache clean:清除缓存

    • npm install| yarn | pnpm install/i: 安装所有依赖

    • npm install [package]| yarn add [package]| pnpm add [package]: 安装某个依赖项

    • npm install --save-dev/-D [package]| yarn add --dev/-D [package]| | pnpm add --dev/-D [package]: 安装开发依赖

    • npm uninstall [package]| yarn remove [package]| pnpm remove/rm [package]: 卸载依赖

    • npm update| yarn upgrade| pnpm update/up: 更新全部依赖

    • npm update [package]| yarn upgrade [package]| pnpm update/up [package]|: 更新某个依赖

    安全性

    npm 最不好的缺点之一就是安全性,曾经的版本发生过几个严重的安全漏洞, npm 6 开始则是在安装之前会检查安全漏洞,
    并且支持使用 npm audit 手动检查安装包的安全性,如果发现安全问题,可以运行 npm audit fix 修复漏洞。
    因为 npm/yarn 是扁平化依赖结构,有个非常严重的问题就是可以非法访问未声明的包,而 pnpm 是将依赖通过 link 的形式避免了非法访问依赖的问题,如果没在 package.json 声明的话,是无法访问的。

    yarnpnpm 同样也支持 yarn/pnpm audit 手动检查安装包的安全性。

    yarnnpm 都是使用 hash加密算法 确保包的完整性。

    lock 文件

    package.json 跟踪的依赖项和版本总是不准确的,因为 ~ ^ * 等前缀表示依赖更新时对应的版本范围。
    范围版本可以在更新依赖时自动升级依赖到兼容性的次要版本或者补丁版本,让软件包支持最新的功能或者修复最近的错误。

    所以,为了避免不同设备安装依赖时的版本不匹配的问题,在 lock 文件中定义了精确的安装版本。在每次新装(更新)依赖时,npmyarn 会分别
    创建(更新) package-lock.jsonyarn.lock 文件。这样就能保证其他设备安装完全相同的包。

    pnpm 中,则是使用 pnpm-lock.yaml 文件定义依赖包的精确版本。

    性能对比

    npm/pnpm/yarn/yarnPnp install 性能对比

    测试 package.json 位置

    actioncachelockfilenode_modulesnpmpnpmYarnYarn PnP
    install51s14.4s39.1s29.1s
    install5.4s1.3s707msn/a
    install10.9s3.9s11s1.8s
    install33.4s6.5s26.5s17.2s
    install28.3s11.8s23.3s14.2s
    install4.6s1.7s22.1sn/a
    install6.5s1.3s713msn/a
    install6.1s5.4s41.1sn/a
    updaten/an/an/a5.1s10.7s35.4s28.3s


    根据上面的测试结果我们可以看出,首次执行 npm install 安装依赖时 pnpmnpmyarn 大约快了 3 倍左右,在有缓存和已安装过依赖的情况,比 npm 也快了不少,yarn 则是更快,其他场景 pnpm 也是占了很大优势。

    pnpm 的优势

    速度很快、节约空间

    pnpm 的所有依赖包统一存储在 store,不会出现像 npmyarn 每个项目会下载独立的依赖,yarn 是从缓存下载文件,而 pnpm 是从 store 中链接依赖,pnpm 更节约空间,
    当安装某个依赖时,新项目会使用硬链接到 store 的这个依赖,多个项目不会出现多次安装依赖的情况,磁盘只有一次写入。
    对于依赖的不同版本,在 pnpm 中,则只会保存增量文件。比如:某个包有100个文件,如果更新版本只会修改其中的一个文件,不会因为新版本的存在而保存所有的依赖文件。
    因为 pnpm 的依赖包存储在 store 同样也支持离线安装的功能。

    没有扁平化 node_modules 结构

    pnpm 不会扁平化依赖数,它的 node_modules 布局使用符号链接来创建依赖关系的嵌套结构。
    pnpm 所有包都有自己的依赖项组合在一起,内部每个包使用符号链接将它们组合在一起。

    一个 vue3 项目pnpm node_modules 结构

    modules-tree-1.png

    vite 包的 pnpm 结构

    modules-tree.png

    参考链接

    展开全文
  • 包管理工具-npm-npx-yarn-cnpm

    千次阅读 2022-01-03 16:23:40
    包管理工具解析 代码共享方案 我们已经学习了在JavaScript中可以通过模块化的方式将代码划分成一个个小的结构: 在以后的开发中我们就可以通过模块化的方式来封装自己的代码,并且封装成一个工具; 这个工具我们...

    包管理工具解析

    代码共享方案

    我们已经学习了在JavaScript中可以通过模块化的方式将代码划分成一个个小的结构:

    • 在以后的开发中我们就可以通过模块化的方式来封装自己的代码,并且封装成一个工具;
    • 这个工具我们可以让同事通过导入的方式来使用,甚至你可以分享给世界各地的程序员来使用;

    如果我们分享给世界上所有的程序员使用,有哪些方式呢?

    • 方式一:上传到GitHub上、其他程序员通过GitHub下载我们的代码手动的引用
      • 缺点是大家必须知道你的代码GitHub的地址,并且从GitHub上手动下载;
      • 需要在自己的项目中手动的引用,并且管理相关的依赖;
      • 不需要使用的时候,需要手动来删除相关的依赖;
      • 当遇到版本升级或者切换时,需要重复上面的操作;
    • 显然,上面的方式是有效的,但是这种传统的方式非常麻烦,并且容易出错;
    • 方式二:使用一个专业的工具来管理我们的代码
      • 我们通过工具将代码发布到特定的位置;
      • 其他程序员直接通过工具来安装、升级、删除我们的工具代码;

    显然,通过第二种方式我们可以更好的管理自己的工具包,其他人也可以更好的使用我们的工具包。

    包管理工具npm

    包管理工具npm:

    • Node Package Manager,也就是Node包管理器;
    • 但是目前已经不仅仅是Node包管理器了,在前端项目中我们也在使用它来管理依赖的包;
    • 比如vue、vue-router、vuex、express、koa、react、react-dom、axios、babel、webpack等等;

    如何下载npm工具呢?

    • npm属于node的一个管理工具,所以我们需要先安装Node;
    • node管理工具:https://nodejs.org/en/

    npm管理的包可以在哪里查看、搜索呢?

    • https://www.npmjs.org/
    • 这是我们安装相关的npm包的官网;

    npm管理的包存放在哪里呢?

    • 我们发布自己的包其实是发布到registry上面的;
    • 当我们安装一个包时其实是从registry上面下载的包;

    npm的配置文件

    那么对于一个项目来说,我们如何使用npm来管理这么多包呢?

    • 事实上,我们每一个项目都会有一个对应的配置文件,无论是前端项目(Vue、React)还是后端项Node;
    • 这个配置文件会记录着你项目的名称、版本号、项目描述等;
    • 也会记录着你项目所依赖的其他库的信息和依赖库的版本号;

    这个配置文件就是package.json

    那么这个配置文件如何得到呢?

    • 方式一:手动从零创建项目,npm init –y
    • 方式二:通过脚手架创建项目,脚手架会帮助我们生成package.json,并且里面有相关的配置

    常见的配置文件

    在这里插入图片描述

    常见的属性

    必须填写的属性:name、version

    • name是项目的名称;
    • version是当前项目的版本号;
    • description是描述信息,很多时候是作为项目的基本描述;
    • author是作者相关信息(发布时用到);
    • license是开源协议(发布时用到);

    private属性:

    • private属性记录当前的项目是否是私有的;
    • 当值为true时,npm是不能发布它的,这是防止私有项目或模块发布出去的方式;

    main属性:

    • 设置程序的入口。
    • 很多人会有疑惑,webpack不是会自动找到程序的入口吗?
      • 这个入口和webpack打包的入口并不冲突;
      • 它是在你发布一个模块的时候会用到的;
      • 比如我们使用axios模块 const axios = require(‘axios’);
      • 实际上是找到对应的main属性查找文件的;

    scripts属性

    • scripts属性用于配置一些脚本命令,以键值对的形式存在;
    • 配置后我们可以通过 npm run 命令的key来执行这个命令;
    • npm start和npm run start的区别是什么?
      • 它们是等价的;
      • 对于常用的 start、 test、stop、restart可以省略掉run直接通过 npm start等方式运行;

    dependencies属性

    • dependencies属性是指定无论开发环境还是生成环境都需要依赖的包;
    • 通常是我们项目实际开发用到的一些库模块vue、vuex、vue-router、react、react-dom、axios等等;
    • 与之对应的是devDependencies;

    devDependencies属性

    • 一些包在生成环境是不需要的,比如webpack、babel等;
    • 这个时候我们会通过 npm install webpack --save-dev,将它安装到devDependencies属性中;

    peerDependencies属性

    • 还有一种项目依赖关系是对等依赖,也就是你依赖的一个包,它必须是以另外一个宿主包为前提的;
    • 比如element-plus是依赖于vue3的,ant design是依赖于react、react-dom;

    engines属性

    • engines属性用于指定Node和NPM的版本号;
    • 在安装的过程中,会先检查对应的引擎版本,如果不符合就会报错;
    • 事实上也可以指定所在的操作系统 “os” : [ “darwin”, “linux” ],只是很少用到;

    browserslist属性

    • 用于配置打包后的JavaScript浏览器的兼容情况,参考;
    • 否则我们需要手动的添加polyfills来让支持某些语法;
    • 也就是说它是为webpack等打包工具服务的一个属性(这里不是详细讲解webpack等工具的工作原理,所以不再给出详情);

    依赖的版本管理

    我们会发现安装的依赖版本出现:^2.0.3或~2.0.3,这是什么意思呢?

    npm的包通常需要遵从semver版本规范:

    • semver:https://semver.org/lang/zh-CN/
    • npm semver:https://docs.npmjs.com/misc/semver

    semver版本规范是X.Y.Z:

    • X主版本号(major):当你做了不兼容的 API 修改(可能不兼容之前的版本);
    • Y次版本号(minor):当你做了向下兼容的功能性新增(新功能增加,但是兼容之前的版本);
    • Z修订号(patch):当你做了向下兼容的问题修正(没有新功能,修复了之前版本的bug);

    我们这里解释一下 ^和~的区别:

    • ^x.y.z:表示x是保持不变的,y和z永远安装最新的版本;
    • ~x.y.z:表示x和y保持不变的,z永远安装最新的版本;

    npm install 命令

    安装npm包分两种情况:

    • 全局安装(global install): npm install webpack -g;
    • 项目(局部)安装(local install): npm install webpack

    全局安装

    • 全局安装是直接将某个包安装到全局:
    • 比如yarn的全局安装:

    但是很多人对全局安装有一些误会:

    • 通常使用npm全局安装的包都是一些工具包:yarn、webpack等;
    • 并不是类似于 axios、express、koa等库文件;
    • 所以全局安装了之后并不能让我们在所有的项目中使用 axios等库;

    项目安装

    项目安装会在当前目录下生产一个 node_modules 文件夹,我们之前讲解require查找顺序时有讲解过这个包在什

    么情况下被查找;

    局部安装分为开发时依赖和生产时依赖:

    在这里插入图片描述

    npm install 原理

    大家之前应该已经会了 npm install ,但是你是否思考过它的内部原理呢?

    • 执行 npm install它背后帮助我们完成了什么操作?
    • 我们会发现还有一个成为package-lock.json的文件,它的作用是什么?
    • 从npm5开始,npm支持缓存策略(来自yarn的压力),缓存有什么作用呢?

    这是一幅画出的根据 npm install 的原理图:

    在这里插入图片描述

    npm install 原理图解析

    npm install会检测是有package-lock.json文件:

    • 没有lock文件
      • 分析依赖关系,这是因为我们可能包会依赖其他的包,并且多个包之间会产生相同依赖的情况;
      • 从registry仓库中下载压缩包(如果我们设置了镜像,那么会从镜像服务器下载压缩包);
      • 获取到压缩包后会对压缩包进行缓存(从npm5开始有的);
      • 将压缩包解压到项目的node_modules文件夹中(前面我们讲过,require的查找顺序会在该包下面查找)
    • 有lock文件
      • 检测lock中包的版本是否和package.json中一致(会按照semver版本规范检测);
        • 不一致,那么会重新构建依赖关系,直接会走顶层的流程;
      • 一致的情况下,会去优先查找缓存
        • 没有找到,会从registry仓库下载,直接走顶层流程;
      • 查找到,会获取缓存中的压缩文件,并且将压缩文件解压到node_modules文件夹中;

    package-lock.json

    • package-lock.json文件解析:
    • name:项目的名称;
    • version:项目的版本;
    • lockfileVersion:lock文件的版本;
    • requires:使用requires来跟踪模块的依赖关系;
    • dependencies:项目的依赖
      • 当前项目依赖axios,但是axios依赖follow-redireacts;
      • axios中的属性如下:
        • version表示实际安装的axios的版本;
        • resolved用来记录下载的地址,registry仓库中的位置;
        • requires记录当前模块的依赖;
        • integrity用来从缓存中获取索引,再通过索引去获取压缩包文件;

    yarn工具

    另一个node包管理工具yarn:

    • yarn是由Facebook、Google、Exponent 和 Tilde 联合推出了一个新的 JS 包管理工具;
    • yarn 是为了弥补 npm 的一些缺陷而出现的;
    • 早期的npm存在很多的缺陷,比如安装依赖速度很慢、版本依赖混乱等等一系列的问题;
    • 虽然从npm5版本开始,进行了很多的升级和改进,但是依然很多人喜欢使用yarn;
      在这里插入图片描述

    cnpm工具

    由于一些特殊的原因,某些情况下我们没办法很好的从 https://registry.npmjs.org下载下来一些需要的包。

    查看npm镜像:npm config get registry

    我们可以直接设置npm的镜像:npm config set registry

    但是对于大多数人来说(比如我),并不希望将npm镜像修改了:

    • 第一,不太希望随意修改npm原本从官方下来包的渠道;
    • 第二,担心某天淘宝的镜像挂了或者不维护了,又要改来改去;

    这个时候,我们可以使用cnpm,并且将cnpm设置为淘宝的镜像:

    npm install -g cnpm --registry=https://registry.npm.taobao.org

    cnpm config get registry # https://r.npm.taobao.org/

    npx工具

    npx是npm5.2之后自带的一个命令。

    npx的作用非常多,但是比较常见的是使用它来调用项目中的某个模块的指令。

    我们以webpack为例:

    • 全局安装的是webpack5.1.3
    • 项目安装的是webpack3.6.0

    如果我在终端执行 webpack --version使用的是哪一个命令呢?

    • 显示结果会是 webpack 5.1.3,事实上使用的是全局的,为什么呢?
    • 原因非常简单,在当前目录下找不到webpack时,就会去全局找,并且执行命令;

    如何解决这个问题呢?

    那么如何使用项目(局部)的webpack,常见的是两种方式:

    • 方式一:明确查找到node_module下面的webpack—./node_modules/.bin/webpack --version

    • 方式二:在 scripts定义脚本,来执行webpack; “scripts”: {“webpack”: “webpack --version”}

    • 方式三:使用npx---->>>npx webpack --version

    npm发布自己的包

    注册npm账号:

    • https://www.npmjs.com/
    • 选择sign up

    在命令行登录:npm login

    修改package.json

    发布到npm registry上

    更新仓库:

    • 1.修改版本号(最好符合semver规范)
    • 2.重新发布

    在这里插入图片描述

    展开全文
  • Go:包管理工具GOPATH、vendor、dep 、go module

    万次阅读 多人点赞 2020-02-13 17:05:56
    Go包管理工具:前言 Golang一直存在一个被人诟病的问题是缺少一个官方的包依赖管理工具。从我个人的角度上来看存在两个问题: GOPATH特性对于多工程的情况下,支持不算友好。 GOPATH无法对依赖包进行有效的版本...

    目录

    Go包管理工具:前言

    GOPATH

    vendor、dep

    Go modules

    Module 文件

    go mod命令

    Go modules使用步骤:

    go module的文件下载后位置:


    Go包管理工具:前言

    Golang一直存在一个被人诟病的问题是缺少一个官方的包依赖管理工具。从我个人的角度上来看存在两个问题:

    1. GOPATH特性对于多工程的情况下,支持不算友好。
    2. GOPATH无法对依赖包进行有效的版本管理,没有任何地方能够表明依赖包的具体版本号,无法简单清晰获取到有效的依赖包版本信息等。

    GOPATH

    GOPATH
    1. 在 1.8 版本前必须设置这个环境变量
    2. 1.8 版本后(含 1.8)如果没有设置使⽤用默认值

    • 在 Unix 上默认为 $HOME/go , 在 Windows 上默认为 %USERPROFILE%/go
    • 在 Mac 上 GOPATH 可以通过修改 ~/.bash_profile 来设置
       

    在 go mod 出现之前,所有的 Go 项目都需要放在同一个工作空间:$GOPATH/src 内,比如:

    src/
        github.com/golang/example/
            .git/                      # Git repository metadata
        outyet/
            main.go                # command source
            main_test.go           # test source
        stringutil/
            reverse.go             # package source
            reverse_test.go        # test source

    相比其他语言,这个限制有些无法理解。其实,这和 Go 的一设计理念紧密相关:

    包管理应该是去中心化的

    所以 Go 里面没有 maven/npm 之类的包管理工具只有一个 go get,支持从公共的代码托管平台(Bitbucket/GitHub..)下载依赖,当然也支持自己托管,具体可参考官方文档:Remote import paths

    由于没有中央仓库,所以 Go 项目位置决定了其 import path,同时为了与 go get 保持一致,所以一般来说我们的项目名称都是 github.com/user/repo 的形式。
    当然也可以不是这种形式,只是不方便别人引用而已,后面会讲到如何在 go mod 中实现这种效果

    vendor、dep

    使用 go get 下载依赖的方式简单暴力,伴随了 Go 七年之久,直到 1.6(2016/02/17)才正式支持了 vendor,可以把所有依赖下载到当前项目中,解决可重复构建(reproducible builds)的问题,但是无法管理依赖版本。社区出现了各式各样的包管理工具,来方便开发者固化依赖版本,由于不同管理工具采用不同的元信息格式(比如:godep 的 Godeps.json、Glide 的 glide.yaml),不利于社区发展,所以 Go 官方推出了 dep

    dep 的定位是实验、探索如何管理版本,并不会直接集成到 Go 工具链,Go 核心团队会吸取 dep 使用经验与社区反馈,开发下一代包管理工具 modules,并于 2019/09/03 发布的 1.13 正式支持,并随之发布 Module Mirror, Index, Checksum,用于解决软件分发、中间人攻击等问题。下图截取自 Go 官方博客

    Module Big Picture

    Go modules

    Go modules机制在go 1.11中是experiment feature,按照Go的惯例,在新的experiment feature首次加入时,都会有一个特性开关,go modules也不例外,GO111MODULE这个临时的环境变量就是go module特性的experiment开关。

    GO111MODULE有三个值:auto、on和off,默认值为auto。

    GO111MODULE的值会直接影响Go compiler的“依赖管理”模式的选择(是GOPATH mode还是module-aware mode),我们详细来看一下:

    • 当GO111MODULE的值为off时,go modules experiment feature关闭,go compiler显然会始终使用GOPATH mode,即无论要构建的源码目录是否在GOPATH路径下,go compiler都会在传统的GOPATH和vendor目录(仅支持在gopath目录下的package)下搜索目标程序依赖的go package;

    • 当GO111MODULE的值为on时(export GO111MODULE=on),go modules experiment feature始终开启,与off相反,go compiler会始终使用module-aware mode,即无论要构建的源码目录是否在GOPATH路径下,go compiler都不会在传统的GOPATH和vendor目录下搜索目标程序依赖的go package,而是在go mod命令的缓存目录($GOPATH/pkg/mod)下搜索对应版本的依赖package

    • 当GO111MODULE的值为auto时(不显式设置即为auto),也就是我们在上面的例子中所展现的那样:使用GOPATH mode还是module-aware mode,取决于要构建的源码目录所在位置以及是否包含go.mod文件

      • 如果要构建的源码目录不在以GOPATH/src为根的目录体系下,且包含go.mod文件(两个条件缺一不可),那么使用module-aware mode;

      • 否则使用传统的GOPATH mode。

    Module 文件

    执行命令 go build && go mod tidy ,下载依赖并整理。

    项目根目录下会生成两个文件(需要加入到 git 中):

    • 文件 go.mod:指示模块名称、go 的版本、该模块的依赖信息(依赖名称),类似 npm 生成的文件 package.json 。
    • 文件 go.sum:该模块的所有依赖的校验和,类似 npm 生成的文件 package-lock.json 

    Module 是多个 package 的集合,版本管理的基本单元,使用 go.mod 文件记录依赖的 module。

    go.mod 位于项目的根目录,支持 4 条命令:module、require、replace、exclude。示例:

    module github.com/my/repo
    
    require (
        github.com/some/dependency v1.2.3
        github.com/another/dependency/v4 v4.0.0
    )
    • module 声明 module path,一个 module 内所有 package 的 import path 都以它为前缀
    • require 声明所依赖的 module,版本信息使用形如 v(major).(minor).(patch) 的语义化版本 
    • replace/exclude 用于替换、排查指定 module path

    go mod命令

    golang 提供了 go mod命令来管理包。

    go mod 有以下命令:

    命令说明
    downloaddownload modules to local cache(下载依赖包)
    editedit go.mod from tools or scripts(编辑go.mod)
    graphprint module requirement graph (打印模块依赖图)
    initinitialize new module in current directory(在当前目录初始化mod)
    tidyadd missing and remove unused modules(拉取缺少的模块,移除不用的模块)
    vendormake vendored copy of dependencies(将依赖复制到vendor下)
    verifyverify dependencies have expected content (验证依赖是否正确)
    whyexplain why packages or modules are needed(解释为什么需要依赖)

    Go modules使用步骤:

    1. 首先将你的版本更新到最新的Go版本(>=1.11)。
    2. 通过go命令行,进入到你当前的工程目录下,在命令行设置环境变量
      #方式1:临时设置
      
      注意
      
      # Windows环境用set
      # linux环境用export
      
      #########Windows#########
      # 开启
      set GO111MODULE=on
      # 1.13 之后才支持多个地址,之前版本只支持一个
      set GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct
      # 1.13 开始支持,配置私有 module,不去校验 checksum
      set GOPRIVATE=*.corp.example.com,rsc.io/private
      
      
      #########Linux#########
      # 开启
      export GO111MODULE=on
      # 1.13 之后才支持多个地址,之前版本只支持一个
      export GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct
      # 1.13 开始支持,配置私有 module,不去校验 checksum
      export GOPRIVATE=*.corp.example.com,rsc.io/private
      
      #方式2:全局设置
      # 设置全局开启 go mod Go1.16版本默认为on,可跳过这一步
      go env -w GO111MODULE=on 
      # 设置全局代理地址
      go env -w GOPROXY=https://goproxy.cn,https://mirrors.aliyun.com/goproxy,direct 
      
    3. 执行命令go mod init在当前目录下生成一个go.mod文件,执行这条命令时,当前目录不能存在go.mod文件。如果之前生成过,要先删除;
    4. 如果你工程中存在一些不能确定版本的包,那么生成的go.mod文件可能就不完整,因此继续执行下面的命令;
    5. 执行go mod tidy命令,它会添加缺失的模块以及移除不需要的模块。执行后会生成go.sum文件(模块下载条目)。添加参数-v,例如go mod tidy -v可以将执行的信息,即删除和添加的包打印到命令行;
    6. 执行命令go mod verify来检查当前模块的依赖是否全部下载下来,是否下载下来被修改过。如果所有的模块都没有被修改过,那么执行这条命令之后,会打印all modules verified。
    7. 执行命令go mod vendor生成vendor文件夹,该文件夹下将会放置你go.mod文件描述的依赖包,文件夹下同时还有一个文件modules.txt,它是你整个工程的所有模块。在执行这条命令之前,如果你工程之前有vendor目录,应该先进行删除。同理go mod vendor -v会将添加到vendor中的模块打印出来;

    go module的文件下载后位置:

    存储下载的依赖包,具体位置在$GOPATH/pkg/mod

    在 Go 1.8 版本之前,GOPATH 环境变量默认是空的。从 Go 1.8 版本开始,Go 开发包在安装完成后,将 GOPATH 赋予了一个默认的目录,参见下表。

    GOPATH 在不同平台上的安装路径
    平  台GOPATH 默认值举 例
    Windows 平台%USERPROFILE%/goC:\Users\用户名\go
    Unix 平台$HOME/go/home/用户名/go

    代理地址

    https://goproxy.cn  //七牛云赞助支持的开源代理
    https://mirrors.aliyun.com/goproxy  //阿里云官方维护的go代理
    https://goproxy.io //也是一个开源的go代理

    参考链接:

    何处安放我们的 Go 代码 - Keep Coding

    初窥Go module | Tony Bai

    golang module 开发基本流程 | 生活的自留地

    research!rsc: Go & Versioning

    展开全文
  • python包管理工具之PIP

    热门讨论 2014-02-20 13:29:58
    下载get-pip.py后,在已安装python的机器上执行python get-pip.py, 即可安装pip
  • RPM包管理器dpkg包管理器二、C++ 有没有像 pip、npm、gem 一样的包管理工具?三、C++包管理器有哪些1. [Conan](https://github.com/conan-io/conan)2. [Buckaroo](https://github.com/LoopPerfect/buckaroo)3. ...
  • javascript包管理工具发展历史

    千次阅读 2022-03-02 23:45:57
    npm和yarn都是javascript包管理工具;因为npm在使用过程中暴露出一些问题;但恰恰yarn下载依赖包和包版本管理等方面比较有优势;所以其中yarn快速发展;但是npm后续也在不断完善,所以二者现在是良性竞争的阶段; ...
  • Linux篇(三):Linux的包管理工具

    千次阅读 2018-12-22 21:12:23
    什么是包管理工具 软件包管理工具的作用是提供在操作系统中安装,升级,卸载需要的软件的方法,并提供对系统中所有软件状态信息的查询。在 GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和DPT为最常见的两类软件包...
  • Java类包管理工具——jar

    千次阅读 2017-12-20 08:06:14
    基础概念 JAR文件格式以流行的ZIP文件格式为基础,用于将多个文件聚集为一个文件。区别于ZIP文件的地方,JAR文件不仅用于压缩和发布,而且还... 为创建、管理JAR文件,可以使用作为JDK一部分的jar命令行工具(存在
  • npm包管理工具的安装及配置使用

    万次阅读 多人点赞 2018-02-22 12:26:16
    1、什么是npmnpm(Node Package Manager,即:node包管理器)是nodeJS的一个程序包管理和分发的管理工具,npm完全用JavaScript写成,它可以让全世界与Web前端相关开发者共享代码,非常方便的使用各种插件、库和框架...
  • pnpm更高效率的包管理工具

    千次阅读 2018-07-11 12:26:49
    github homePage pnpm 优点: 1、效率更高 2、更小的空间占用(同一版本的只会下载一次) 3、安全,与yarn一样,不会出现像npm那样的意外错误 安装 # use npm npm add pnpm # 完成后运行 pnpm add pnpm -g 查看指定...
  • 而不同的依赖由各自的版本工具独立管理,所以当所依赖的在新版本发生接口变更或删除时,会面临很多问题。 为避免此类问题,我们可能会为不同的工程设置不同的GOPATH,或者更改依赖路径名称。这样手动维护起来...
  • 简单来说pip就是Python的一个包管理工具,可以对第三方的包进行管理操作,例如,安装、卸载、检查更新、查看包信息等等。 2、安装pip 安装pip之前,首先要保证已经安装了Python开发环境。还是老规矩,仍然以...
  • Alpine包管理工具apk使用介绍

    千次阅读 2019-06-18 09:57:09
    Alpine以它的小巧和实用深受总多开发者的喜爱,而提到Alpine的Linux,其包管理工具apk则是在Alpine中使用广泛的一个工具,这篇文章简要介绍一下常见的使用方式。
  • Java - Maven第三方jar包管理工具使用

    千次阅读 2017-04-10 16:50:33
    Java开发经常会依赖第三方的东西,iOS有第三方库管理工具:cocopods,安卓有gradle ,java使用的是:Maven,前提:安装好Eclipse 1.首先Eclipse要集成安装Maven插件安装Maven参考文章:...
  • Python的包管理工具pip的安装与使用

    千次阅读 2017-01-23 13:30:00
    Python的包管理工具pip的安装与使用 【Preface】 Python有两个著名的包管理工具easy_install.py和pip。在Python2.7的安装包中,easy_install.py是默认安装的,而pip需要我们手动安装。 pip可以运行在Unix/...
  • 因为 Device Simulator 是 priview 的版本,所以要在包管理工具中把预览打开,步骤如下 Windows ➡️ Package Manager 右上角齿轮设置 图标 ➡️ Enable Preview Package 打上勾
  • Ubuntu安装Python的包管理工具Pip

    万次阅读 2015-09-18 22:45:08
    Python的包管理工具Pip 参考 https://pypi.python.org/pypi/setuptools/ https://pypi.python.org/pypi/pip#downloads 下载pipwget ...
  • Golang包管理工具(三)之dep的使用

    千次阅读 2018-07-23 17:03:23
    更多golang包管理工具参考 - dep的使用 - glide的使用 - govendor的使用 1. dep简介 dep是一个golang项目的包管理工具,一般只需要2-3个命令就可以将go依赖包自动下载并归档到vendor的目录中。dep官网...
  • Python 安装包管理工具 pip

    千次阅读 2021-10-26 08:09:00
    pip 是一个现代的,通用的Python包管理工具。提供了对Python包的查找,下载,安装,卸载的功能,便于对Python的资源包进行管理。在安装Python时会自动下载并安装。在Windows中查看pip的版本pip -V输出:pip 21.3 ...
  • yarn也是node的包管理工具,聚焦于更加快速/稳定/安全的进行依赖管理,这篇文章介绍一下yarn和其使用上的一些特点。 概要信息 项目 说明 官网 https://yarnpkg.com 开源/闭源 开源 License类别 ...
  • 由于使用linux操作系统的需要,小编不得不深入学习了解rpm包管理工具,以便于能够对rpm包进行安装、卸载以及管理。不得不说,rpm的确是Redhat公司的一大贡献,因为他使得Linux的软件安装工作变得更加简单容易。 ...
  • Haskell包管理工具,cabal, stack, nix

    千次阅读 2018-10-17 13:33:57
    Haskell项目中,经常用到包管理工具,有些用cabal,stack, nix。这里对这三个工具做个简要的说明。 首先要明确的是cabal库,是一个haskell包集合的库,提供了不同的包以及不同的版本。cabal-install和stack均是...
  • 前端知识-npm js包管理工具

    万次阅读 2021-01-21 20:10:54
    更新自己 npm i npm@latest -g ...npm i 名[@版本] //安装 同npm i 名–save 默认为依赖 npm i //自动根据package.json下载 npm uninstall npm upate 更新 npm i xxx --save-dev//开发依赖
  • 接触 node 之后,一直使用npm包管理工具, cnpm 一开始会用一些,但是并没有觉得比 npm 快得多,使用 cnpm 的时候还经常安装不成功,只能再用 npm 安装一遍,渐渐的就弃用了 cnpm 。 最近在看《MongoDB高级技术栈全...
  • yarn包管理工具的安装与使用

    千次阅读 2018-03-17 13:43:44
    先说说yarn是啥玩意,一个类似npm的包管理工具,但是比npm多了很多优点,比如:速度快,离线模式,版本控制,支持并行下载如果你受够了那经常下载不稳定的npm的话,可以尝试下yarn那么再来说说具体的安装步骤之类的...
  • goland无法识别go mod包管理工具

    万次阅读 2019-05-24 23:20:28
    在goland的setting里设置启用Go Modules goland Preference->Go->Go Modules(vgo) -> Enable Go Modules(vgo)intergration
  • mac下包管理工具Homebrew使用

    千次阅读 2017-09-06 15:09:22
    1、前言 作为开发需要经常和linux系统...使用mac开发时,系统并没用集成包管理工具,需要开发者自己去配置,本文介绍了mac中常用的包管理工具Homebrew的使用。 2、安装Homebrew 注意:确保mac处于有网络的状态下 打开终
  • Golang包管理工具(二)之glide的使用

    千次阅读 2018-01-14 20:01:29
    glide是一个golang项目的包管理工具,非常方便快捷,一般只需要2-3个命令就可以将go依赖包自动下载并归档到vendor的目录中。glide官网参考:https://glide.sh/ 2. glide安装 go get github....
  • Python的包管理工具

    千次阅读 2013-12-29 14:44:44
    刚开始学习Python时,在看文档和别人的blog介绍安装包有的用easy_install, setuptools, 有的使用pip,distribute,那麽这几个工具有什么关系呢,看一下下面这个图就明白了 ...关于这些包工具可以参考 http://guide.pyt

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,404,006
精华内容 561,602
关键字:

包管理工具

友情链接: r_xy077105.zip