20个版本

0.0.20 2020年9月12日
0.0.19 2020年9月11日
0.0.13 2020年8月31日

#9 in #url-path

每月下载量31次

MIT授权

1.5MB
4K SLoC

bvm - 二进制版本管理器

所有二进制文件的版本管理器。

注意:这是一个概念验证。不建议使用,因为可能会出现许多重大更改。

目标

  1. 基于当前工作目录的无缝版本选择。
  2. 替换特定二进制的版本管理工具。
  3. 无中心化——所有URL和路径。
    • 允许轻松地在组织内分发批准的二进制文件。
    • 便于二进制作者分发他们的应用程序。
  4. 支持具有相同命令名称的完全不同的应用程序二进制文件。
  5. 向后兼容加载项目配置文件(达到1.0后)
  6. 无需WSL即可在Windows上运行。
  7. 允许与路径上现有的二进制文件一起工作(例如,bvm use deno path)。

设置

  1. 目前,通过cargo安装bvm——cargo install bvm
  2. 手动将shims文件夹添加到路径的第一个位置
    • Windows: %LOCALAPPDATA%\bvm\shims
    • Mac/Linux: $HOME/.bvm/shims
  3. 在项目中添加一个.bvmrc.json文件,并指定二进制清单文件的路径。
    {
      // optional commands to run on pre and post install
      "preInstall": "",
      "postInstall": "",
      // list of binaries to use
      "binaries": [
        "https://bvm.land/deno/1.3.2.json",
        "https://bvm.land/node/14.9.0.json",
        "https://bvm.land/dprint/0.9.1.json"
      ]
    }
    
    或者指定校验和以确保远程文件没有更改
    {
      "binaries": [
        "https://bvm.land/deno/1.3.2.json@6444d03bbb4e8b0a7966f406ab0a6d190581c205291d0e082bc9a57dd8498e97",
        "https://bvm.land/dprint/0.9.1.json@52b473cd29888badf1620ea501afbd210373e6dec66d249019d1a284cf43380b"
      ]
    }
    
  4. 运行bvm install

命令

bvm init

在当前目录创建一个空的.bvmrc.json文件。

bvm install

下载并安装当前.bvmrc.json配置文件中的二进制文件,并在路径上与bvm关联,如果没有之前这样做的话。

  • 提供--use标志以在路径上使用配置文件中的所有二进制文件(如果不在该目录之外)。
  • 提供--force标志以强制安装一切,即使已经安装。

bvm install[url]

在指定的清单文件中安装二进制文件。

# Examples
bvm install https://bvm.land/deno/1.3.2.json
# optionally specify a checksum
bvm install https://bvm.land/deno/1.3.2.json@6444d03bbb4e8b0a7966f406ab0a6d190581c205291d0e082bc9a57dd8498e97
# if a previous installation is on the path, use this one instead
bvm install --use https://bvm.land/deno/1.3.1.json
  • 提供--use标志以强制在路径上使用此二进制文件(如果没有在路径上,则会自动发生)。
  • 提供--force标志以强制安装,即使已经安装。

bvmuse [binary-名称或所有者-名称/binary-名称] [版本]

使用指定的二进制名称和全局版本。

必须先前安装二进制和版本。

# Examples
bvm use deno 1.3.2
bvm use denoland/deno 1.3.2
bvm use name-stealer/deno 2.0.0

bvmuse [binary-名称或所有者-名称/binary-名称]path

如果存在,则使用路径上安装的二进制版本的版本。

# Example
bvm use deno path

bvmuse

在全局路径上使用当前配置文件中的所有二进制文件。

通常不需要使用此命令,因为它会在当前目录中自动执行。

bvm resolve[二进制名称]

根据当前工作目录解析指定二进制的可执行路径。

此命令由创建的shell/批处理文件(shims)用于指示如何解析文件。

# Example
bvm resolve deno
# on windows, outputs: C:\Users\<user>\AppData\Local\bvm\bvm\binaries\denoland\deno\1.3.1\deno.exe

bvm uninstall[binary-名称或所有者-名称/binary-名称] [版本]

卸载指定的二进制版本。

# Examples
bvm uninstall deno 1.2.0
bvm uninstall denoland/deno 1.3.2
bvm uninstall name-stealer/deno 2.0.0

bvm list

显示已安装的二进制文件。

示例输出

denoland/deno 1.2.0
denoland/deno 1.3.2
dprint/dprint 9.0.1
nodejs/node 14.9.0

bvm clear-url-缓存

清除任何缓存的URL。

注册表命令

添加注册表可以使您更容易安装二进制文件的副本,而无需处理URL。

bvm registry add[url]

将指定URL的注册表添加到本地CLI。

# Examples
bvm registry add https://bvm.land/deno/registry.json
bvm registry add https://bvm.land/node/registry.json

bvm registry remove[url]

从本地CLI中移除指定URL的注册表。

# Example
bvm registry remove https://bvm.land/node/registry.json

bvm registry list

列出CLI中保存的注册表。

示例输出

denoland/deno - https://bvm.land/deno/registry.json
nodejs/node - https://bvm.land/node/registry.json

bvm install[binary-名称或所有者-名称/binary-名称]

根据CLI的注册表安装指定二进制的最新非预发布版本。

# Examples
bvm install deno
bvm install --use node

bvm install[binary-名称或所有者-名称/binary-名称] [版本]

根据CLI注册表中第一个匹配的版本安装指定的二进制和版本。

# Examples
bvm install deno 1.3.3
bvm install --use node 14.9.0

实用命令

bvm二进制提供一些可以在安装前和安装后脚本中使用的实用命令(目前只有1个)。

bvm util ensure-path<目录-path>

此实用程序将确保提供的目录位于系统路径上,并在必要时通知用户重新启动终端。

# Examples
bvm util ensure-path %APPDATA%\npm

重定向服务

网站https://bvm.land是一个重定向服务。如果您将bvm.json文件作为GitHub发布资产发布(目前不建议,因为这只是一个概念证明),则可以使用https://bvm.land来重定向到您的发布

  1. https://bvm.land/<owner>/<name>/<release-tag>.json -> https://github.com/<owner>/<name>/releases/download/<release-tag>/bvm.json
  2. https://bvm.land/<name>/<release-tag>.json -> https://github.com/<name>/<name>/releases/download/<release-tag>/bvm.json

示例: https://bvm.land/dprint/0.9.1.json

二进制清单文件

目前,它看起来像这样

{
  "schemaVersion": 1,
  "name": "deno",
  "owner": "denoland",
  "version": "1.3.1",
  "windows-x86_64": {
    "path": "https://github.com/denoland/deno/releases/download/v1.3.1/deno-x86_64-pc-windows-msvc.zip",
    "type": "zip",
    "checksum": "6ba068e517a55dd33abd60e74c38aa61ef8f45a0774578761be0107fafc3758b",
    "commands": [{
      "name": "deno",
      "path": "deno.exe"
    }],
    "preInstall": "# run any command pre installation (ex. kill process)",
    "postInstall": "# this is where you can run some commands if necessary to cause additional setup"
  },
  "linux-x86_64": {
    "path": "https://github.com/denoland/deno/releases/download/v1.3.1/deno-x86_64-unknown-linux-gnu.zip",
    "type": "zip",
    "checksum": "ef3a8740bdceab105808c91cfb918c883a23defb6719b9c511e2be30d5bfdc01",
    "commands": [{
      "name": "deno",
      "path": "deno"
    }]
  },
  "darwin-x86_64": {
    "path": "https://github.com/denoland/deno/releases/download/v1.3.1/deno-x86_64-apple-darwin.zip",
    "type": "zip",
    "checksum": "b1bc5de79b71c3f33d0151486249d088f5f5604126812dc55b1dd21b28704d8a",
    "commands": [{
      "name": "deno",
      "path": "deno"
    }]
  }
}

支持类型:zipexetar.gz(以后将添加更多)

其他示例

未来改进

低努力

  1. 列出注册表中二进制的版本。
  2. 当调用bvm install <binary-name> <version>时,列出找到的10个最相似的版本。
  3. 从注册表中获取版本的URL。
  4. 可能将“注册表”重命名为其他名称,因为它是一个针对每个注册表的二进制文件。
  5. 文档说明为什么不会支持每个注册表中的多个二进制文件(打开问题并在其中写入)。
  6. 在添加注册表后,输出二进制所有者/名称、描述(添加)和最新版本。
  7. URL应该是url::Url。版本应该是semver::Version
  8. 支持bvm use <binary-name>或使用一个版本,甚至bvm use <binary-name>来使用最新版本。
  9. 添加命令以确保清单文件中的所有二进制文件都已安装(在Windows上,当用户在另一台计算机上使用时很有用,因为二进制文件是本地存储的)。

中等难度

  1. 可以在.bvmrc.json中指定支持的版本范围,以减少下载的二进制文件数量
    {
      "binaries": [{
        "path": "https://bvm.land/deno/1.3.1.json",
        "version": "^1.3.0"
      }]
    }
    
  2. 除了URL之外,还支持文件路径。
  3. 可以轻松创建和删除别名(例如:deno2
    • 这些应该与它们别名的二进制文件相关联,当您卸载二进制文件时,别名将被删除。
  4. 配置文件中的命令别名。
    {
      "binaries": [{
        "path": "https://bvm.land/deno/1.3.1.json",
        "alias": "deno-1.3.1"
      }]
    }
    
  5. 可以一次性执行可执行文件的具体版本。 bvm exec deno 1.2.0 -V 或可能在shim级别 deno -V --bvm-use-version 1.2.0... 或者这可能需要使用 bvm resolve 的某种方式。
  6. 添加 bvm lock 以更新配置文件URL的校验和。
  7. 多个子二进制下载位置(例如,假设npm是从不同的zip文件安装的node)。

大工作量

  1. 支持下游二进制依赖项(还应支持依赖项的范围)。

遥远的未来

  1. 支持将注册表拆分为多个文件(例如,它将给出文件内部的semver范围)。这仅适用于非常大的文件。

可能是不必要的复杂性

  1. bvm use <url> - 通过URL全局使用二进制文件的具体版本。
  2. 类似于 npm run <script-name>的东西吗?还是说这超出了范围? 是的。我认为应该有一个可以在bvm中安装的其他工具,该工具应该非常简单。但绝对应该有预安装和后安装脚本。
  3. bvm use <binary name> <executable file path> 用于使用指定文件路径的执行文件。
  4. 能够清除X天内未运行的任何二进制文件。
  5. 在使用 bvm resolve 时获取二进制文件的具体版本(例如:bvm resolve deno 1.3.1
  6. 考虑创建一个隐藏子命令 bvm resolve-v1。过于复杂。最好只有一个命令可以重新创建shim。

依赖关系

~15–29MB
~470K SLoC