Научитесь великолепному управлению скриптами от Deno

Shell deno
Научитесь великолепному управлению скриптами от Deno

Предисловие 🌱

Если вы использовали Deno, Go или настроили Android Studio, вы должны быть знакомы с настройкой переменных среды. Итак, если мы сами пишем сценарий или инструмент командной строки, как мы можем поделиться им с друзьями? Проще всего, конечно, выложить сценарий напрямую, чтобы другие вручную загружали и вручную настраивали переменные среды. Но это не элегантно и не способствует распространению.Эта статья представляет собой набор доступных руководств по распространению двоичных исполняемых файлов после изучения механизма установки Deno.

Дено вv1.7.0поддерживаетсяперекрестная компиляция, в этой статье реализуется простой инструмент командной строки с помощью Deno, который распространяется среди пользователей MacOS, Linux и Windows.

Анализ установки Deno

На официальном сайте мы видим, что у Deno есть множество способов установки, в основном:

  • С оболочкой (Linux/MacOS):curl -fsSL https://deno.land/x/install/install.sh | sh
  • С PowerShell (Windows):iwr https://deno.land/x/install/install.ps1 -useb | iex
  • С доморощенным:brew install deno

А также установить определенные версии:

  • With Shell: curl -fsSL https://deno.land/x/install/install.sh | sh -s v1.0.0
  • With PowerShell: $v="1.0.0"; iwr https://deno.land/x/install/install.ps1 -useb | iex

Метод Homebrew требует, чтобы сценарий установки был объединен вhomebrew-core, но наши скрипты, как правило, относительно небольшие, вы можете обратиться кНи за что? Ни за что! Кто-нибудь еще не отправляет пакеты Homebrew?публиковать, чтобы иметьtapсередина. Для Shell и PowerShell мы будем изучать в этой статье.

подготовить проект

Я подготовил простой проект Deno здесьyoungjuning/seve. Если вы заинтересованы в разработке Deno, вы можете прочитатьDeno от входа до запуска | 🏆 Первый выпуск технической тематикиначиная.

Скомпилируйте проект

мы можем использоватьdeno compile --unstable --target=<target>Команда компилирует наш проект в двоичный исполняемый файл.Необязательные цели:

  • x86_64-unknown-linux-gnu
  • x86_64-pc-windows-msvc
  • x86_64-apple-darwin
  • aarch64-apple-darwin

мы пишемcompile.shДля пакетной компиляции продуктов для каждой платформы (не забудьте выполнитьchmod +x 755 compile.shдать разрешение на выполнение скрипта).

#!/bin/bash
name="seve"
deno compile --unstable --lite --target=x86_64-unknown-linux-gnu index.ts
zip -o -q -m ${name}-x86_64-unknown-linux-gnu.zip ${name}

deno compile --unstable --lite --target=x86_64-pc-windows-msvc -o ./${name}.exe index.ts
zip -o -q -m ${name}-x86_64-pc-windows-msvc.zip ${name}.exe

deno compile --unstable --lite --target=x86_64-apple-darwin index.ts
zip -o -q -m ${name}-x86_64-apple-darwin.zip ${name}

deno compile --unstable --lite --target=aarch64-apple-darwin index.ts
zip -o -q -m ${name}-aarch64-apple-darwin.zip ${name}

Приведенный выше скрипт сгенерирует следующие файлы, нам не нужно загружать их в кодовую базу, поэтому добавьте их в.gitignoreигнорируй их.

Скрипт установки Windows

Сначала давайте посмотрим на скрипт в deno_installinstall.ps1:

#!/usr/bin/env pwsh
# Copyright 2018 the Deno authors. All rights reserved. MIT license.
# TODO(everyone): Keep this script simple and easily auditable.

$ErrorActionPreference = 'Stop'

if ($v) {
  $Version = "v${v}"
}
if ($args.Length -eq 1) {
  $Version = $args.Get(0)
}

$DenoInstall = $env:DENO_INSTALL
$BinDir = if ($DenoInstall) {
  "$DenoInstall\bin"
} else {
  "$Home\.deno\bin"
}

$DenoZip = "$BinDir\deno.zip"
$DenoExe = "$BinDir\deno.exe"
$Target = 'x86_64-pc-windows-msvc'

# GitHub requires TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$DenoUri = if (!$Version) {
  "https://github.com/denoland/deno/releases/latest/download/deno-${Target}.zip"
} else {
  "https://github.com/denoland/deno/releases/download/${Version}/deno-${Target}.zip"
}

if (!(Test-Path $BinDir)) {
  New-Item $BinDir -ItemType Directory | Out-Null
}

Invoke-WebRequest $DenoUri -OutFile $DenoZip -UseBasicParsing

if (Get-Command Expand-Archive -ErrorAction SilentlyContinue) {
  Expand-Archive $DenoZip -Destination $BinDir -Force
} else {
  if (Test-Path $DenoExe) {
    Remove-Item $DenoExe
  }
  Add-Type -AssemblyName System.IO.Compression.FileSystem
  [IO.Compression.ZipFile]::ExtractToDirectory($DenoZip, $BinDir)
}

Remove-Item $DenoZip

$User = [EnvironmentVariableTarget]::User
$Path = [Environment]::GetEnvironmentVariable('Path', $User)
if (!(";$Path;".ToLower() -like "*;$BinDir;*".ToLower())) {
  [Environment]::SetEnvironmentVariable('Path', "$Path;$BinDir", $User)
  $Env:Path += ";$BinDir"
}

Write-Output "Deno was installed successfully to $DenoExe"
Write-Output "Run 'deno --help' to get started"

Этофайл powershell, я не буду здесь подробно объяснять синтаксис, давайте посмотрим на основной код:

...
$Target = 'x86_64-pc-windows-msvc'
...
$DenoUri = if (!$Version) {
  "https://github.com/denoland/deno/releases/latest/download/deno-${Target}.zip"
} else {
  "https://github.com/denoland/deno/releases/download/${Version}/deno-${Target}.zip"
}

Из этого видно, что установочный пакет deno существует в GitHub Release в виде zip, а управление версиями реализовано с опорой на Tag. Следующее изображение является приложением к выпуску Deno 1.7.1:

Действия Deno от сборки до публикации автоматизированы с помощью GitHub Action. Если вам интересно, я могу написать еще один автоматизированный процесс для разбора Deno.

Пользовательский сценарий установки

1. Вручную создайте новыйReleaseИ загрузите сжатый пакет, скомпилированный выше, в качестве вложения:

2. Измените имя в приведенном выше скрипте на наш собственный скрипт:

Если у вас есть cdn, вы можете загрузить его на cdn, я загружу его на github здесь.

#!/usr/bin/env pwsh
# Copyright 2018 the Seve authors. All rights reserved. MIT license.
# TODO(everyone): Keep this script simple and easily auditable.

$ErrorActionPreference = 'Stop'

if ($v) {
  $Version = "v${v}"
}
if ($args.Length -eq 1) {
  $Version = $args.Get(0)
}

$SeveInstall = $env:SEVE_INSTALL
$BinDir = if ($SeveInstall) {
  "$SeveInstall\bin"
}
else {
  "$Home\.seve\bin"
}

$SeveZip = "$BinDir\seve.zip"
$SeveExe = "$BinDir\seve.exe"
$Target = 'x86_64-pc-windows-msvc'

# GitHub requires TLS 1.2
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

$DenoUri = if (!$Version) {
  "https://github.com/youngjuning/seve/releases/latest/download/seve-${Target}.zip"
}
else {
  "https://github.com/youngjuning/seve/releases/download/${Version}/seve-${Target}.zip"
}

if (!(Test-Path $BinDir)) {
  New-Item $BinDir -ItemType Directory | Out-Null
}

Invoke-WebRequest $DenoUri -OutFile $SeveZip -UseBasicParsing

if (Get-Command Expand-Archive -ErrorAction SilentlyContinue) {
  Expand-Archive $SeveZip -Destination $BinDir -Force
}
else {
  if (Test-Path $SeveExe) {
    Remove-Item $SeveExe
  }
  Add-Type -AssemblyName System.IO.Compression.FileSystem
  [IO.Compression.ZipFile]::ExtractToDirectory($SeveZip, $BinDir)
}

Remove-Item $SeveZip

$User = [EnvironmentVariableTarget]::User
$Path = [Environment]::GetEnvironmentVariable('Path', $User)
if (!(";$Path;".ToLower() -like "*;$BinDir;*".ToLower())) {
  [Environment]::SetEnvironmentVariable('Path', "$Path;$BinDir", $User)
  $Env:Path += ";$BinDir"
}

Write-Output "Seve was installed successfully to $SeveExe"
Write-Output "Run 'seve --help' to get started"

3. Скрипт установки

# 安装最新版
iwr https://youngjuning.js.org/seve/install.ps1 -useb | iex
# 安装指定版本
$v="1.0.0"; iwr https://deno.land/x/install/install.ps1 -useb | iex

Unix-подобный скрипт установки

Сначала давайте посмотрим на скрипт в deno_installinstall.sh:

#!/bin/sh
# Copyright 2019 the Deno authors. All rights reserved. MIT license.
# TODO(everyone): Keep this script simple and easily auditable.

set -e

if ! command -v unzip >/dev/null; then
	echo "Error: unzip is required to install Deno (see: https://github.com/denoland/deno_install#unzip-is-required)." 1>&2
	exit 1
fi

if [ "$OS" = "Windows_NT" ]; then
	target="x86_64-pc-windows-msvc"
else
	case $(uname -sm) in
	"Darwin x86_64") target="x86_64-apple-darwin" ;;
	"Darwin arm64") target="aarch64-apple-darwin" ;;
	*) target="x86_64-unknown-linux-gnu" ;;
	esac
fi

if [ $# -eq 0 ]; then
	deno_uri="https://github.com/denoland/deno/releases/latest/download/deno-${target}.zip"
else
	deno_uri="https://github.com/denoland/deno/releases/download/${1}/deno-${target}.zip"
fi

deno_install="${DENO_INSTALL:-$HOME/.deno}"
bin_dir="$deno_install/bin"
exe="$bin_dir/deno"

if [ ! -d "$bin_dir" ]; then
	mkdir -p "$bin_dir"
fi

curl --fail --location --progress-bar --output "$exe.zip" "$deno_uri"
unzip -d "$bin_dir" -o "$exe.zip"
chmod +x "$exe"
rm "$exe.zip"

echo "Deno was installed successfully to $exe"
if command -v deno >/dev/null; then
	echo "Run 'deno --help' to get started"
else
	case $SHELL in
	/bin/zsh) shell_profile=".zshrc" ;;
	*) shell_profile=".bash_profile" ;;
	esac
	echo "Manually add the directory to your \$HOME/$shell_profile (or similar)"
	echo "  export DENO_INSTALL=\"$deno_install\""
	echo "  export PATH=\"\$DENO_INSTALL/bin:\$PATH\""
	echo "Run '$exe --help' to get started"
fi

Приведенный выше сценарий установки — это уже знакомый нам сценарий оболочки, основной код:

if [ "$OS" = "Windows_NT" ]; then
	target="x86_64-pc-windows-msvc"
else
	case $(uname -sm) in
	"Darwin x86_64") target="x86_64-apple-darwin" ;;
	"Darwin arm64") target="aarch64-apple-darwin" ;;
	*) target="x86_64-unknown-linux-gnu" ;;
	esac
fi

Как можно заметить$(uname -sm)Представляет системную архитектуру, в соответствии с которой сценарий может динамически решать, какую платформу установить.

пользовательский скрипт

Публикация релиза и загрузка вложений уже упоминались ранее, поэтому я не буду повторять их здесь.

1. Изменяем имя в приведенном выше скрипте на наш собственный скрипт и загружаем его в подходящее место:

Здесь мы добавили возможность автоматически устанавливать переменные окружения. PS: автор Deno отклонил мой PR, чтобы сохранить сценарий в чистоте.

#!/bin/sh
# Copyright 2021 the Seve authors. All rights reserved. MIT license.
# TODO(everyone): Keep this script simple and easily auditable.

set -e

if ! command -v unzip >/dev/null; then
	echo "Error: unzip is required to install Seve (see: https://github.com/youngjuning/seve#unzip-is-required)." 1>&2
	exit 1
fi

if [ "$OS" = "Windows_NT" ]; then
	target="x86_64-pc-windows-msvc"
else
	case $(uname -sm) in
	"Darwin x86_64") target="x86_64-apple-darwin" ;;
	"Darwin arm64") target="aarch64-apple-darwin" ;;
	*) target="x86_64-unknown-linux-gnu" ;;
	esac
fi

if [ $# -eq 0 ]; then
	seve_uri="https://github.com/youngjuning/seve/releases/latest/download/seve-${target}.zip"
else
	seve_uri="https://github.com/youngjuning/seve/releases/download/${1}/seve-${target}.zip"
fi

seve_install="${SEVE_INSTALL:-$HOME/.seve}"
bin_dir="$seve_install/bin"
exe="$bin_dir/seve"

if [ ! -d "$bin_dir" ]; then
	mkdir -p "$bin_dir"
fi

curl --fail --location --progress-bar --output "$exe.zip" "$seve_uri"
unzip -d "$bin_dir" -o "$exe.zip"
chmod +x "$exe"
rm "$exe.zip"

echo "Seve was installed successfully to $exe"
if command -v seve >/dev/null; then
	echo "Run 'seve --help' to get started"
else
	case $SHELL in
	/bin/zsh) shell_profile=".zshrc" ;;
	*) shell_profile=".bash_profile" ;;
	esac
	echo "# Seve" >> $HOME/$shell_profile
	echo "export SEVE_INSTALL=\"$seve_install\"" >> $HOME/$shell_profile
	echo "export PATH=\"\$SEVE_INSTALL/bin:\$PATH\"" >> $HOME/$shell_profile
	source $HOME/$shell_profile
	echo "Run 'seve' to get started"
fi

2. Скрипт установки

# 安装最新版
curl -fsSL https://youngjuning.js.org/seve/install.sh | sh
# 安装指定版本
curl -fsSL https://youngjuning.js.org/seve/install.sh | sh -s v0.0.1

На данный момент мы реализовали собственное управление скриптами, пример кода находится вyoungjuning/seve, если полезно, добро пожаловать в Star.

Ускорить внутренний

Это другая история, мы можем подражать боссу justjavac вjustjavac/deno_releasesимитировал копию того, что было сделано в . Отличие от оригинального сценария в том, что он основан наjsdelivrУскорено CDN.

Так как у jsdeliver лимит 20М, я открыл склад по кодингу и могу использоватьhttps://youngjuning.js.org/deno/install.shа такжеhttps://youngjuning.js.org/deno/install.ps1скрипт для установки. Спасибо за напоминание в разделе комментариев. Использование такое же, как у deno, просто замените ссылку.

уведомление

  • Powershell Программирование Основы
  • Аналитика процесса автоматизации действий DENO GITHUB
  • Начало работы с Deno CLI Development

У Tuya Smart большое количество качественных НС, присоединяться могут все желающие, вам нужно добавить меня в WeChat yang_jun_ning, или отправить свое резюме прямо на почтуyoungjuning@aliyun.com