精华内容
下载资源
问答
  • package
    千次阅读
    2021-01-23 21:22:34

    这里的自定义package指带有特定功能的一些文件做成在别的工程通过package manager加载的包。

    功能插件做成自定义packge的特点在于让插件的开发和维护与用户工程的开发文件完全隔离,用户工程不能更改插件内容但是能将插件用于实际开发中。

    实际云端给的单个项目大小一般最大不可能有超过2G,coding的最大,码云的第二,github第三,这种情况下,package manager的方式是比较适合的。

    package可以放置任意格式的文件,在package中的prefab和scene等所有文件不能被更改,只能拖拽复制到当前场景,或者拖拽到Assets文件夹中,拖拽到Assets中之后更改才能被保存。

    而且预制体拖拽出来也会出现丢失脚本。

    但是实际操作时候发现自定义package里面的场景实际上引用之后是使用不了的, 即使将场景拖拽到asset文件夹, 上面挂载的来自package的脚本会识别不了。而且即使package里面含有类似Tool这类在顶部的编辑界面代码 引用后的工程也不会出现。

    在这里插入图片描述

    文章的操作是在Mac系统下进行的,Windows操作步骤大体相同,细节有点差别

    创建自定义package

    unity对自定义package的文件夹结构有一定的要求,开发者需要遵循这些要求制作。详细参考Package layout

    更多相关内容
  • 前言Swift Package Manager 是 Apple 为了弥补当前 iOS 开发中缺少官方组件库管理工具的产物。相较于其他组件管理控件,他的定义文件更加轻松易懂,使用起来也很 M...

    前言

    Swift Package Manager 是 Apple 为了弥补当前 iOS 开发中缺少官方组件库管理工具的产物。相较于其他组件管理控件,他的定义文件更加轻松易懂,使用起来也很 Magic,只需将源码放入对应的文件夹内,Xcode 就会自动生成工程文件,并生成编译目标产物所需要的相关配置。同时,SPM 与 Cocoapods 相互兼容,可以在特性上提供互补。

    • 项目地址:

      • https://github.com/apple/swift-package-manager

    • 相关文档:

      • https://developer.apple.com/documentation/swift_packages

    这篇文章将主要介绍该组件管理器的现状,常见使用方法,和将来的一些思考。

    现状

    开源组件使用情况

    查看当前开源组件的 SPM 接入供应情况,不难发现几乎全部还在维护的框架都支持使用这种方式集成。大到微软的 APM SDK,小到界面 UI 组件,均有良好的兼容支持。下面列举一些可能会在后续开发中用到的组件。资源选自 https://github.com/ivanvorobei/awesome-ios。检测规则为是否在仓库主目录下存在 Package.swift 文件。

    统计中,56%左右的框架已经适配了 SPM 接入,且已经开始出现如 MarkdownUI 等框架仅适配 SPM 的情况。

    一些优势

    • 简化的定义流程:将文件放入约定的目录内即可一键打包。

    • 简化的 SPM 版本管理:Xcode 会根据定义文件首行说明自动查找兼容的解决方案。

    • 简化的上手流程:不需要安装工具,也不需要命令行安装组件。

    • 良好的持续集成能力:在完成项目配置以后,xcodebuild 无缝衔接,自动拉仓。

    • 良好的兼容性:可与现有的大多数组件管理方案混用。

    • 良好的调试能力:断点快狠准。

    一些缺点

    • 文档难找。

    • 使用远端仓库对网络要求非常高。

    使用方法

    创建组件

    创建组件可以在 Xcode 中选择 Swift Package,也可以在命令行中写入 swift package init。命令行创建会将当前目录名称用作包名。

    Creating library package: Desktop
    Creating Package.swift
    Creating README.md
    Creating .gitignore
    Creating Sources/
    Creating Sources/Desktop/Desktop.swift
    Creating Tests/
    Creating Tests/DesktopTests/
    Creating Tests/DesktopTests/DesktopTests.swift
    

    定义组件

    基础的定义看起来长这个样子。别急,我们一行一行来看。

    // swift-tools-version:5.5

    请勿忽略本行,当打包编译出现工具链版本不匹配、 SDK 版本、系统 API 最低版本等问题时需要首先到这里排查可能存在的问题。

    // swift-tools-version:5.5
    
    import PackageDescription
    
    let package = Package(
      name: "MyLibrary",
      products: [
        .library(name: "MyLibrary", targets: ["MyLibrary"]),
      ],
      dependencies: [ ],
      targets: [
        .target(name: "MyLibrary", dependencies: []),
        .testTarget(name: "MyLibraryTests", dependencies: ["MyLibrary"]),
      ]
    )
    

    基础定义

    Swift Package 的定义稍微有一些绕,但是稍微解释一下也就明了了。

    Targets

    先看 targets,定义是 A target can define a module or a test suite. 翻译来说,就是一个 target 对应一个 clang module 或者 一个测试目标。一个 target 内只允许使用一类语言,比方说 Swift 或者 Objective-C/C/CPP。此处的 name 只对当前 package 可见,可以填写在任意一个 dependencies 内。Target 支持 binary Target,可使用 XCFramwork 或 .a .so 等二进制。

    Products

    再看 products,定义是 Products define the executables and libraries a package produces, and make them visible to other packages. 一个 product 可以包含多个 target,他们会被编译成产物提供给项目。如果其他项目依赖当前的 Swift Package,此处的 name 可以填写入其他 Package 的依赖需求内,一般对内不可用。最后来看一下 product 的几种类型。一般来说,常见的 .library 可 type 包含 .static (默认) 和 .dynamic。除开 .library 还有 .executable 可选,用于编译测试用二进制和 macOS 命令行工具。

    .library(name: "MorphingLabel", targets: ["MorphingLabel"]),
    .library(name: "MorphingLabelDynamic", type: .dynamic, targets: ["MorphingLabel"]),
    
    .executable(name: "appdecrypt", targets: ["appdecrypt"])
    

    资源文件

    Swift Package 需要对每一个文件指明用途。代码文件会自动识别并编译打包,资源文件需要指定和说明。Swift Package 会为每一个 Package 生成一个 module 扩展,以便直接调用。使用命令行将项目文件 Package.swift 转换成 xcproj 则不会生成该模版定义文件。以下定义会在 Bundle 类内生成 .module 属性专门用于获取 Particles 文件夹内的资源。

    .target(
        name: "MorphingLabel",
            exclude: ["Info.plist", "tvOS-Info.plist"],
            resources: [ .process("Particles") ] // <-- 资源文件
    ),
    

    目录结构

    Swift Package 推荐使用原生目录结构,不推荐自定义 Path。

    Swift Package 导出头文件有规定的位置,在当前 Source Path 内创建 include 会自动导出。

    Swift Package 需要对每一个资源文件/文件夹显示声明,对通配符的适配存在 Bug。

    当需要特定的文件目录组织的时候可以使用 符号连接 来链接目标文件。

    总体来说 Swift Package 中一个 Target 对应一个 name,而 项目根目录/Sources/name 会作为当前 Target 的工作搜索路径。

    .
    ├── Package.swift        # 定义文件
    ├── README.md            # 可忽略
    ├── Sources              # 此文件夹内全部文件都需要定义 不然会报错
    │  └── demo             # target demo 的默认目录
    │    ├── Particles.     # 在 target 内声明为资源文件
    │    │  └── fire.png   # 会自动打包成 bundle 拷贝并传递
    │    ├── demo.swift     # target demo 的项目源代码
    │    └── include        # 导出头文件
    │      └── export.h     # 头文件
    
    # 在 Sources / target name 厘头的资源文件可在 Package.swift 内定义。
    # 需要在 target 内添加 resources: [ .process("Particles") ]
    

    其他说明

    XCFramework

    关于编译产物,基础的 Swift Package 可以生成静态库、动态库,在这以后可以手动打包成 XCFramework。SPM 的打包工作流对 XCFramework 非常友好,可以参考下面这个脚本。

    xcodebuild -create-xcframework \
            -framework "$BUILD_FOLDER/iOS.xcarchive/Products/Library/Frameworks/MorphingLabel.framework" \
            -framework "$BUILD_FOLDER/tvOS.xcarchive/Products/Library/Frameworks/MorphingLabel.framework" \
            -framework "$BUILD_FOLDER/Simulator.xcarchive/Products/Library/Frameworks/MorphingLabel.framework" \
            -framework "$BUILD_FOLDER/tvOSSimulator.xcarchive/Products/Library/Frameworks/MorphingLabel.framework" \
            -output Build/LTMorphingLabel.xcframework
    

    https://github.com/lexrus/LTMorphingLabel/blob/master/build_xcframework.sh

    product -> .library(name: "MorphinglabelXCFramework", targets: ["LTMorphingLabel"])
    // 需要手动打包,此处仅提供名称给其他项目调用,依赖会使用二进制库
    target -> .binaryTarget(
        name: "LTMorphingLabel",
        url: "https://github.com/lexrus/LTMorphingLabel/releases/download/0.9.3/LTMorphingLabel.xcframework.zip",
        checksum: "28a0ed8b7df12c763d45b7dde2aa41fd843984b79e6fbd3750f2fc1a6c247a13"
    )
    

    目前有针对 Package.swift 生成并编译 XCFrameowrk 的懒人工具,但是由于其依赖将项目转换成 xcproj 的编译方法,携带资源文件的 Swift Package 并不能用。

    https://github.com/akkyie/XPM

    一些实践

    目前笔者有一个开源的私人项目使用了 SPM,可以拉下仓库来看一看。Xcode 在解析各种依赖方面并不稳定,所以项目采用的方案是将所有代码拉到本地并通过修改 dependencies 的方式采用本地解析集成。本地集成的方式非常稳定,而且最大程度的保证了你修改源码的能力。Swift 发展非常快,目前不推荐 url 直接集成远端仓库。

    https://github.com/SailyTeam/Saily

    在本地创建 xcworkspace 以后便可以直接将 Package.swift 中的 product 添加到项目的编译流程内。这里再次赞赏 Swift Package 的多元兼容,其中有一些库是纯 Objective-C 撰写的,可以一键无缝集成。

    本地集成的其他好处自然也包含 0 编译警告,遇到任何问题你都可以直接打断点到 Swift Package 的代码上。而 Cocoapod 经常不灵。关于编译警告,养眼准备!

    其中可以重点关注几个混合编译的库的定义和 Fluent Icon 库的定义文件。其中就如上面描述的一样,include 文件会被自动导出给 Swift 使用。

    常见问题

    Q: 我导入了 Swift Package 到项目,但无法 import

    A: 请 command + shift + K 清理项目重新编译。Swift Package 有 module 缓存。

    Q: 我的 include 指向上级目录的头文件,导出失败了

    A: 请清理项目重新编译,有时需要重启 Xcode。

    Q: 我在编译的时候指定了最低要求 iOS 13,为何 Swift Package 无法调用 API?

    A: 请检查 Package.swift 是否有在 platform 内指定版本,如有请升级 swift-tools-version 定义行。

    Q: 我的资源文件在添加 process 以后仍然有警告

    A: 请使用文件夹名字或指定每一个文件的名字,通配符并不能很好的工作。

    Q: 我在定义 Package.swift 的时候没有找到你说的这个几个字段

    A: 请升级第一行的 swift-tools-version。

    Q: 联网拉取 Swift Package 无法完成

    A: 请考虑清除 ~/Library/Caches/org.swift.swiftpm/,并换个好一些的网络。如果依然失败请删除 Package.resolved 文件

    如有问题可以添加评论补充。

    后记

    本人是十分喜欢 Swift Package 的,本地集成方便快捷,也给我很大的权力让我所想落实到几乎不可能落实的上游仓库。配合 Swift Access Control,例如 module 内可访问的 internal 属性,很大程度上解决了写 App 后台的时候被 UI 意外调用造成的 crash,弥补上 Swift 没有 class-private 访问控制关键字的遗憾。调试可以直接打到代码上,速度也很快。如果能为 Package 提供 .patch 的扩展文件,再配合优化后的远端仓库,这将很有可能取代臃肿的 Cocoapod。pod 会修改编译目标的 xcconfig,而 Swift Package 通过提供 library 和 workspace 的集成方式,侵入性非常低。最后,Swift Package 的多平台编译的能力也非常好,UIKit 一次编写即可适配 iOS/iPadOS/tvOS/watchOS,编译配置 CI 只需要调用 xcodebuild 即可自动解析,如有缺失自动拉取,省时省力。个人项目我可能不会再碰 Cocoapods。

    由于 Swift Package 在世界范围内的文档资源都非常稀缺,一旦出现问题,很难自行搜索解决,会需要参考非常多已有开源项目的代码,知识点非常零散。如果有一些想法,请考虑给我们留言或者写一写评论。

    加入我们

    字节跳动 APM 中台目前致力于提升整个集团内全系产品的性能和稳定性表现,技术栈覆盖 iOS/Android/Flutter/Web/Hybrid/PC/游戏/小程序等,工作内容包括但不限于线上监控,线上运维,深度优化,线下防劣化等。长期期望为业界输出更多更有建设性的问题发现和深度优化手段。同时密切保持对业界前沿技术的关注,如 Swift async/await,SwiftUI,Swift Package Manager 等。

    欢迎各位有识之士加入我们,一起为了“更快,更稳,更省,更有品质”的极致目标携手前行。我们在北京,深圳两地均有招聘需求,简历投递邮箱:tech@bytedance.com ;邮件标题:姓名 - 工作年限 - APM 中台 - 技术栈方向(如 iOS/Android/Web/后端)。

    点个在看杀个 Bug ❤

    展开全文
  • 大家好,我是纸飞机,想必大家都在项目中经常看见package.json、package-lock.json、node_modules这三剑客,那么他们到底是什么呢?又有什么作用呢?今天就来带你们理一遍! 一、引读 在大家的印象中,说明书具有...

    大家好,我是纸飞机,想必大家都在项目中经常看见package.jsonpackage-lock.jsonnode_modules这三剑客,那么他们到底是什么呢?又有什么作用呢?今天就来带你们理一遍! 

    一、引读

    在大家的印象中,说明书具有哪些要素?例如一盒药。

    就像这份说明书,它有:药品名称、成分、类别等等说明!package.json同样如此,所以可以毫不夸张的说,它也是一份说明书!那么我们的package.json到底说明了什么呢?下面就进入正题为您一一讲解。

    二、package.json说明了哪些内容

    文件展示:

    {
      "name": "firstapp",
      "version": "0.1.0",
      "author": "zhangsan <zhangsan@163.com>",
      "description": "我就是世界上第一个node.js程序",
      "keywords": ["node.js", "javascript"],
      "private": true,
      "bugs": {
        "url": "http://path/to/bug",
        "email": "bug@example.com"
      },
      "contributors": [{
        "name": "张不烂",
        "email": "lisi@example.com"
      }],
      "repository": {
        "type": "git",
        "url": "https://path/to/url"
      },
      "homepage": "http://necolas.github.io/normalize.css",
      "license": "MIT",
      "dependencies": {
        "react": "^16.8.6",
        "react-dom": "^16.8.6",
        "react-router-dom": "^5.0.1",
        "react-scripts": "3.0.1"
      },
      "devDependencies": {
        "browserify": "~13.0.0",
        "karma-browserify": "~5.0.1"
      },
      "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "test": "react-scripts test",
        "eject": "react-scripts eject"
      },
      "bin": {
        "webpack": "./bin/webpack.js"
      },
      "main": "lib/webpack.js",
      "module": "es/index.js",
      "eslintConfig": {
        "extends": "react-app"
      },
      "engines": {
        "node": ">=0.10.3 <0.12"
      },
      "browserslist": {
        "production": [
          ">0.2%",
          "not dead",
          "not op_mini all"
        ],
        "development": [
          "last 1 chrome version",
          "last 1 firefox version",
          "last 1 safari version"
        ]
      },
      "style": [
        "./node_modules/tipso/src/tipso.css"
      ],
      "files": [
        "lib/",
        "bin/",
        "buildin/",
        "declarations/",
        "hot/",
        "web_modules/",
        "schemas/",
        "SECURITY.md"
      ]
    }
    参数内容
    name项目/模块名称,长度必须小于等于214个字符,不能以"."(点)或者"_"(下划线)开头,不能包含大写字母
    version项目版本
    author项目开发者,它的值是你在https://npmjs.org网站的有效账户名,遵循“账户名<邮件>”的规则,例如:zhangsan zhangsan@163.com
    description项目描述,是一个字符串。它可以帮助人们在使用npm search时找到这个包
    keywords项目关键字,是一个字符串数组。它可以帮助人们在使用npm search时找到这个包
    private是否私有,设置为 true 时,npm 拒绝发布
    license软件授权条款,让用户知道他们的使用权利和限制
    bugsbug 提交地址
    contributors项目贡献者
    repository项目仓库地址
    homepage项目包的官网 URL
    dependencies生产环境下,项目运行所需依赖
    devDependencies开发环境下,项目所需依赖
    scripts执行 npm 脚本命令简写,比如 “start”: “react-scripts start”, 执行 npm start 就是运行 “react-scripts start”
    bin内部命令对应的可执行文件的路径
    main项目默认执行文件,比如 require(‘webpack’);就会默认加载 lib 目录下的 webpack.js 文件,如果没有设置,则默认加载项目跟目录下的 index.js 文件
    module以 ES Module(也就是 ES6)模块化方式进行加载,因为早期没有 ES6 模块化方案时,都是遵循 CommonJS 规范,而 CommonJS 规范的包是以 main 的方式表示入口文件的,为了区分就新增了 module 方式,但是 ES6 模块化方案效率更高,所以会优先查看是否有 module 字段,没有才使用 main 字段
    eslintConfigEsLint 检查文件配置,自动读取验证
    engines项目运行的平台
    browserslist供浏览器使用的版本列表
    style供浏览器使用时,样式文件所在的位置;样式文件打包工具parcelify,通过它知道样式文件的打包位置
    files被项目包含的文件名数组

    Tip:加粗部分请重点了解。

    那么这么个文件如何创建呢?

    先新建文件夹再:

    npm init -y

    这样就初始化了一个package.json。

    三、package-lock.json

    用一句话来概括很简单,就是锁定安装时的包的版本号,并且需要上传到git,以保证其他人在npm install时大家的依赖能保证一致。

    四、node_modules

    node_modules是安装node后用来存放用包管理工具下载安装的包的文件夹。比如webpackgulpgrunt这些工具。在node.js中模块与文件是一一对应的,也就是说一个node.js文件就是一个模块。

    modules(模块):

    在node.js中模块与文件是一一对应的,也就是说一个node.js文件就是一个模块,文件内容可能是我们封装好的一些JavaScript方法、jsON数据、编译过的C/C++拓展等,在关于node.js的误会提到过node.js的架构。

    其中http、fs、net等都是node.js提供的核心模块,使用C/C++实现,外部用JavaScript封装。

    require搜索module方式:

    node.js中模块有两种类型:核心模块文件模块,核心模块直接使用名称获取,比如最长用的http模块。

    var http = require('http');

    在上面例子中我们使用了相对路径 './test'来获取自定义文件模块。

    node加载模块的方法:

    核心模块优先级最高,直接使用名字加载,在有命名冲突的时候首先加载核心模块,文件模块只能按照路径加载。(可以省略默认的.js拓展名,不是的话需要显示声明书写) 

    • 绝对路径
    • 相对路径 

    展开全文
  • npm的package.json和package-lock.json更新策略

    万次阅读 多人点赞 2020-04-19 16:09:45
    如果你之前用npm 安装产生了package-lock.json,后面的人用cnpm来安装你的package.json、package-lock.json安装可能会跟你安装的依赖包不一致,这是因为cnpm 不受package-lock.json影响,只会根据package.json进行...

    语义化版本

    在一探package-lock.json究竟之前,你必须要理解semver。它是npm背后的小小功臣。你可以从这里了解到npm是如何使用它的。概括来讲,假若你在开发一个可供其它应用使用的应用(或者叫包依赖),你必须说明每次升级变更会对第三方使用产生哪些影响。这就是语义化版本想要传达的。一个版本有三部分:X, Y, Z,分别指代大版本,小版本,与查缺补漏版本。比如1.2.3,那么就是大版本1,小版本2,bugfix版本3。bugfix版本不会影响任何功能,小版本变更往往是增加新功能,也不会影响使用。而大版本变更往往会带来使用层面不兼容的情况,需要再做调整。(想想webpack每次升级的时候!)

    NPM包管理

    正是为了让包管理变简单,npm出现了。一个项目可能有上百个依赖,每个依赖又有上百个依赖。为了你不陷入依赖地狱,只需简单几行命令,npm就可以安装并管理这些依赖,大大节省了时间。

    当你使用npm安装一个包(并保存它)的时候,package.json里就自动添加了一条信息,包括包名和其版本。npm当然也支持版本的通配符。npm默认安装最新版本,然后在其版本号之前添加一个^符号。比如^1.2.12,它表明最低应使用1.2.12版本,并且在这之上,拥有相同大版本号的任何版本都是OK的。毕竟小版本和bugfix版本不会对使用造成任何影响,所以用任何相同大版本的更高级版本都很安全。可以从这里了解semver通配符的更多信息,以及npm的semver计算器。

    • 符号^:表示安装不低于该版本的应用,但是大版本号需相同,例如:vuex: "^3.1.3"3.1.3及其以上的3.x.x都是满足的。
    • 符号~:表示安装不低于该版本的应用,但是大版本号和小版本号需相同,例如:vuex: "^3.1.3"3.1.3及其以上的3.1.x都是满足的。
    • 无符号:无符号表示固定版本号,例如:vuex: "3.1.3",此时一定是安装3.1.3版本。

    为什么需要package-lock.json

    npm install的输入是package.json,它的输出是一棵node_modules树。理想情况下,npm install应该像纯函数一样工作,对于同一个package.json总是生成完全相同的node_modules树。在某些情况下,确实如此。但在其他很多情况中,npm无法做到这一点。有以下原因:

    • 不同版本的npm的安装算法不同。
    • 某些依赖项自上次安装以来,可能已发布了新版本,因此将根据package.json中的semver-range version更新依赖。
    • 某个依赖项的依赖项可能已发布新版本,即使您使用了固定依赖项说明符(是"1.2.3"而不是"^1.2.3"),它也会更新,因为你无法固定子依赖项的版本。
    // package.json
    "dependencies": {
        "packageA": "^2.1.0"
    }
    

    而依赖项版本更新可能会带来一些问题,例如:程序猿A新建了一个项目,生成了上面 ↑ 这份package.json文件,但程序猿A安装依赖的时间比较早,此时packageA的最新版本是2.1.0,该版本与代码兼容,没有出现bug。后来程序猿B克隆了程序猿A的项目,在安装依赖时packageA的最新版本是2.2.0,那么根据语义,npm会去安装2.2.0的版本,但2.2.0版本的API可能发生了改动,导致代码出现bug。

    这就是package.json会带来的问题,同一份package.json在不同的时间和环境下安装会产生不同的结果

    理论上这个问题是不应该出现的,因为npm作为开源世界的一部分,也遵循一个发布原则:相同大版本号下的新版本应该兼容旧版本。即2.1.0升级到2.2.0API不应该发生变化。

    但很多开源库的开发者并没有严格遵守这个发布原则,导致了上面的这个问题。

    为了在不同的环境下生成相同的node_modulesnpm使用package-lock.json。无论何时运行npm installnpm都会生成或更新package-lock.json

    不同npm版本下npm i的规则

    • npm 5.0.x版本:不管package.json中依赖是否有更新,npm i都会根据package-lock.json下载。针对这种安装策略,有人提出了这个issue - #16866 ,然后就演变成了5.1.0版本后的规则。
    • 5.1.0版本后:当package.json中的依赖项有新版本时,npm install会无视package-lock.json去下载新版本的依赖项并且更新package-lock.json。针对这种安装策略,又有人提出了一个issue - #17979,参考 npm 贡献者 iarna 的评论,得出5.4.2版本后的规则。
    • 5.4.2版本后:
      • 如果只有一个package.json文件,运行npm i会根据它生成一个package-lock.json文件,这个文件相当于本次install的一个快照,它不仅记录了package.json指明的直接依赖的版本,也记录了间接依赖的版本。
      • 如果package.jsonsemver-range versionpackage-lock.json中版本兼容(package-lock.json版本在package.json指定的版本范围内),即使此时package.json中有新的版本,执行npm i也还是会根据package-lock.json下载 ------ 示例参考下面实践场景一
      • 如果手动修改了package.jsonversion ranges,且和package-lock.json中版本不兼容,那么执行npm ipackage-lock.json将会更新到兼容package.json的版本 ------ 示例参考下面实践场景二

    注意:npm install读取package.json创建依赖项列表,并使用package-lock.json来通知要安装这些依赖项的哪个版本。如果某个依赖项在package.json中,但是不在package-lock.json中,运行npm install会将这个依赖项的确定版本更新到package-lock.json中,不会更新其它依赖项的版本。

    实践

    场景一
    // package.json
    "dependencies": {
    	"vue": "^2.0.0"
    }
    
    // package-lock.json
    "dependencies": {
    	"vue": {
    		"version": "2.1.0",
    		"resolved": "https://registry.npm.taobao.org/vue/download/vue-2.1.0.tgz",
    		"integrity": "sha1-KTuj76rKhGqmvL+sRc+FJMxZfj0="
    	}
    }
    

    这种情况下package-lock.json指定的2.1.0^2.0.0指定的范围内,npm install会安装vue2.1.0版本。

    场景二
    // package.json
    "dependencies": {
    	"vue": "^2.2.0"
    }
    
    // package-lock.json
    "dependencies": {
    	"vue": {
    		"version": "2.1.0",
    		"resolved": "https://registry.npm.taobao.org/vue/download/vue-2.1.0.tgz",
    		"integrity": "sha1-KTuj76rKhGqmvL+sRc+FJMxZfj0="
    	}
    }
    

    这种情况下package-lock.json指定的2.1.0不在^2.2.0指定的范围内,npm install会按照^2.2.0的规则去安装最新的2.6.10版本,并且将package-lock.json的版本更新为2.6.10

    关于npm源

    最近开发中有一个新需求,需要使用 tim-js-sdk,使用 npm install tim-js-sdk -S 下载 tim-js-sdk 后,发现 package-lock.json 中有一个包的 resolved 字段变成了 registry.npmjs.org,具体说明如下 :

    • 首先查询本地的 npm 源:npm config get registry
      在这里插入图片描述
    • 然后下载 tim-js-sdk:npm install tim-js-sdk -Spackage-lock.json 会更新。package-lock.json 部分前后对比图:左边是更新前的,我同事开发时安装的,右边是更新后的,主要的变化就是 resolved 字段从 11x.2x.1xx.6x:4873 变成了 registry.npmjs.org
      在这里插入图片描述
      node_modules@babel/generatorpackage.json 部分截图:
      在这里插入图片描述
      node_modules@vant/weapppackage.json 部分截图:
      在这里插入图片描述
    • 结论:node_modules 下的每个包的 package.json 中指定了 _resolved 字段,当去更新 package-lock.json 时,会去 copy 这个字段,而不是当前 npm 指定的源。很有可能是在初始化项目、一开始执行 npm install 的时候的源是 registry.npmjs.org,后面即使你更新了源,也不会改变已经下载的包的 _resolved 字段。可以通过删掉整个 node_modules 重新下载解决这个问题,当然最好的方式是在项目根目录下创建一个 .npmrc 的文件,在其中指定 npm 源,以保证团队的成员使用的是统一的 npm 源,这样就不会在拉取代码的时候出现 package-lock.json 中有很多冲突的情况。

    关于npm ci

    介绍
    • ci:Continuous Integration。
    • npm 版本至少是 v5.7.1。
    • 此命令与 npm install 类似,不同之处在于它旨在用于自动化环境,例如集成测试环境、线上环境、或者您希望确保干净安装依赖项的任何情况。通过跳过某些面向用户的功能,它可以比常规的 npm install 快得多。它也比常规安装更严格,它可以捕获由于本地环境的增量安装引起的错误或不一致。
    • npm ci 是根据 package-lock.json 去安装确定的依赖,package.json 只是用来验证是不是有不匹配的版本,假设 package-lock.json 中存在一个确定版本的依赖 A,如果 package.json 中不存在依赖 A 或者依赖 A 版本和 lock 中不兼容,npm ci 就会报错。
    npm ci 和 npm install 差异
    • 项目必须存在 package-lock.json 或 npm-shrinkwrap.json。
    • 如果 package-lock.json 中的依赖和 package.json 中不匹配,npm ci 会退出并且报错,而不是去更新 package-lock.json。
    • npm ci 只能安装整个项目的依赖,无法安装单个依赖。
    • 如果 node_modules 已经存在,它将在 npm ci 开始安装之前自动删除。
      npm ci 永远不会改变 package.json 和 package-lock.json。
    • 缓存 npm ci --cache .npm
    • npm ci 时建议加上 --quiet --no-progress 关闭进度和其他无用 log,否则产生的日志会很大。
    • 所以 ci 时推荐完整的命令为 npm ci --cache .npm --quiet --no-progress

    npm和cnpm的差异

    • cnpm i不受package-lock.json影响,只会根据package.json进行下载。
    • cnpm i xxx@xxx不会跟新到package-lock.json中去。
    • npm i xxx@xxx会跟新到package-lock.json中去。
    • 总结:所以在实际开发中不建议使用cnpm

    参考

    展开全文
  • package.json与package-lock.json

    千次阅读 2022-02-08 11:29:09
    package.json 记录当前项目所依赖模块的版本信息,更新模块时锁定模块的大版本号(版本号的第一位),不能锁定后面的小版本, package-lock.json package-lock.json 是在 `npm install`时候生成一份文件。记录了...
  • Package Control.sublime-package

    千次下载 热门讨论 2013-04-25 10:47:41
    现在介绍的这个 Package Control 可以看做是一个ST2的扩展管理器,使用它,你可以用非常神奇、非常简单方便的方法去下载、安装、删除 Sublime Text 2 的各种插件、皮肤等,相信我,想更好地使用 ST2 绝对不能没有它...
  • Sublime Test 3 Package Control

    千次下载 热门讨论 2016-09-27 21:52:18
    Sublime Test 3 Package Control
  • package.json 在 Node.js 中,模块是一个库或框架,也是一个 Node.js 项目。Node.js 项目遵循模块化的架构,当我们创建了一个 Node.js 项目,意味着创建了一个模块,这个模块的描述文件,被称为 package.json。 ...
  • cmake:指定find_package的搜索路径

    千次阅读 2021-03-25 14:07:56
    find_package(OpenCV PATHS /opt/opencv NO_DEFAULT_PATH REQUIRED) if (OpenCV_FOUND) include_directories(${OpenCV_INCLUDE_DIRS}) message( ${OpenCV_LIBS}) else() message("OpenCV not found, so we won...
  • packager.exe

    热门讨论 2011-10-26 10:30:36
    PACKAGER.EXE是微软Windows操作系统相关工具,用于对象安装包。 解决:XP中word打不开内嵌对象
  • package.json scripts 脚本使用指南

    万次阅读 多人点赞 2020-01-18 13:43:41
    package.json scripts 脚本使用指南 Node 开发离不开 npm,而脚本功能是 npm 最强大、最常用的功能之一。本文介绍如何使用 npm 脚本(npm scripts)。 一、package.json scripts 脚本是什么 npm 允许在package.json...
  • cmake(7):find_package命令详解

    千次阅读 2020-10-20 11:09:33
    cmake的find_package命令对于构建软件提供了极大的便利,虽然知道怎么使用已经能解决大部分问题,但是cmake支持哪些包?为什么它能找到需要的包?如果是自己编写的库,需要如何做才能使用该命令进行构建等原理性问题...
  • sublime_package_control-python3.zip

    千次下载 热门讨论 2015-11-04 10:05:09
    sublime_package_control-python3.zip用来安装Emmet插件时使用.
  • “轻松搞定CMake”系列之find_package用法详解

    万次阅读 多人点赞 2020-04-12 13:27:37
    本文是“轻松搞定CMake”系列博客中的一篇,该篇文章的主要目的是详细讲解一下CMake中搜包命令find_package的使用和原理。 find_packakge命令基本介绍 在我们实际开发过程中,经常不可避免会使用到第三方开源库,...
  • Oracle 包详解(package

    千次阅读 多人点赞 2020-10-14 21:41:11
    文章目录1 概述2 示例3 请注意 1 概述 1. 包的概念 ... (1) 包头:package (2) 包体:package body 3. 授权: grant execute on 属主.包名 to 用户1, 用户n; 4. 调用: '属主.包名.存储过程名()' 或 '属主.包
  • IDEA 创建package

    千次阅读 2021-04-07 18:30:36
    1、首先,打开一个的IntelliJ IDEA的代码工具...4、弹出了new package窗口中,输入上相关的名称 5、包名名称输入完成之后,在输入框内点击Enter 按键,完成包名创建。 6、可以在当前中的包的文件创建成功了。 ...
  • 解决 dpkg: warning: files list file for package ‘x’ missing 问题 在 Ubuntu 下通过 apt-get 安装软件或者更新时,出现大量的 dpkg: warning 日志: dpkg: warning: files list file for package 'libssh2-1:...
  • cmake教程4(find_package使用)

    万次阅读 多人点赞 2018-06-03 19:34:31
    1. cmake find_package的基本原理 2. 如何编写自己的 cmake module模块 3. 使用cmake find_package 使用不同版本的opencv lib问题(opencv 安装在指定的目录,不是系统的目录) 1. cmake find_package的...
  • Sublime英文汉化包资源(Default.sublime-package
  • Go报错:package X is not a main package

    千次阅读 2021-12-07 16:05:11
    有时候会遇到package github.com/pkg/profile is not a main package问题。 这是因为我使用的是go install , 换成 go get之后就好了 不知道为啥,记录一下。X
  • can't load package: cannot find module providing package github.com/hyperledger/fabric/core/chaincode/shim: working directory is not part of a module .build/bin/peer CGO_CFLAGS=" " GOBIN=/root/go/src/...
  • npm与package.json详解

    万次阅读 多人点赞 2019-05-17 20:26:35
    可以重复的框架代码被称为包(package)或者模块(module),一个包可是是一个文件夹里放着几个文件夹,还有一个package.json文件。 npm的作用就是让我们把可复用的框架代码发布到一个地方,可以供大家一起使用。 2、...
  • package-lock.json 文件的作用

    千次阅读 2022-02-14 20:04:41
    package-lock.json 文件的作用
  • patch-package —— 对 npm 依赖项进行修复
  • 在本系列上一篇文章Android包管理机制(一)PackageInstaller的初始化中我们学习了PackageInstaller是如何初始化的,这一篇文章我们接着学习PackageInstaller是如何安装APK的。本系列文章的源码基于Android8.0。 ...
  • 解决Ubuntu报错 E: Unable to locate package yum

    万次阅读 多人点赞 2021-07-05 19:20:54
    解决Ubuntu报错 E: Unable to locate package yum ​ 开门见山,Ubuntu的包管理工具是apt-get,所以不必再安装yum。如果要安装其他包需要使用apt-get命令。 # 这里以locate命令为例 sudo apt-get install mlocate ...
  • Java包(Package)的详细用法(转)

    千次阅读 2021-02-13 02:04:33
    Java包(Package)的详细用法当一个大型程序交由数个不同的程序人员开发时,用到相同的类名是很有可能的,那么如果发生了这样的事件我们该怎么办那?,在我们java程序开发中为了避免上述事件,提供了一个包的概念...
  • 用于创建此对象的程序是package 您的计算机尚未安装此程序,需要在C:\WINDOWS\system32放入 package.exe
  • package.json 文件详解

    万次阅读 多人点赞 2019-06-13 01:32:24
    随着前端由多页面到单页面,由零散的文件到模块化开发,在一个完整的项目中,package.json 文件无处不在。首先,在项目根目录会有,其次在 node_modules 中也频现。那么这个文件到底是干嘛的,又有什么作用,今天给...
  • package.json简介

    千次阅读 2021-02-19 16:31:14
    文章目录1、package.json简介2、package.json属性说明3、生成package.json文件注意: 1、package.json简介 什么是Node.js的模块(Module)? 在Node.js中,模块是一个库或框架,也是一个Node.js项目。Node.js项目...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,827,237
精华内容 1,930,894
关键字:

package

友情链接: source.zip