pacman (Русский)/Package signing (Русский)
Состояние перевода: На этой странице представлен перевод статьи pacman/Package signing. Дата последней синхронизации: 30 октября 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.
Для проверки подлинности пакетов pacman использует ключи GnuPG и сеть доверия. Действующие мастер-ключи Arch Linux можно найти здесь. Ключи разработчиков и сопровождающих пакетов, которыми они подписывают свои пакеты, должны быть подписаны минимум тремя мастер-ключами. У каждого пользователя также есть свой уникальный PGP-ключ, сгенерированный при настройке утилиты pacman-key. Сеть доверия связывает ключи пользователей и мастер-ключи.
Примеры сетей доверия:
- Пользовательские пакеты: обычный пользователь создаёт пакет и подписывает его своим локальным ключом.
- Неофициальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика; обычный пользователь подписывает ключ разработчика локальным ключом.
- Официальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика, подписанным мастер-ключами Arch Linux; обычный пользователь подписывает локальным ключом мастер-ключ и доверяет последнему поручиться за разработчика.
Примечание: Протокол HKP использует TCP-порт 11371. Утилите pacman-key нужен этот порт для скачивания подписанных ключей с серверов.
Настройка
Настройка pacman
Опция SigLevel в файле /etc/pacman.conf определяет уровень доверия, необходимый для установки пакета через pacman -S . Подробную информацию о SigLevel можно найти в руководстве pacman.conf(5) § PACKAGE AND DATABASE SIGNATURE CHECKING и в комментариях в самом файле. Можно настроить проверку подписи как глобально, так для каждого репозитория в отдельности. Если задать SigLevel глобально в разделе [options] , то все пакеты, устанавливаемые через pacman -S , должны быть подписаны. При стандартном значении LocalFileSigLevel пакеты, которые вы собрали сами и устанавливаете через pacman -U , подписывать не требуется.
Примечание: В настоящее время все официальные пакеты подписаны, но подписывание баз данных на ноябрь 2018 не завершено. Если в параметре SigLevel задано значение Required , необходимо также указать и DatabaseOptional .
Настройка по умолчанию позволяет устанавливать только те скачиваемые пакеты, которые подписаны доверенными ключами:
/etc/pacman.conf
SigLevel = Required DatabaseOptional
Параметр TrustedOnly используется в pacman по умолчанию, то есть настройка ниже аналогична предыдущей:
SigLevel = Required DatabaseOptional TrustedOnly
То же самое можно задать и для отдельного репозитория далее в файле конфигурации:
[core] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist
Здесь явно задаётся проверка подписи для пакетов из этого репозитория, но подпись базы данных не проверяется. Если задать здесь значение Optional , то для этого репозитория глобальное значение Required будет отключено.
Важно: SigLevel TrustAll даёт системе указание считать все ключи доверенными. Эта значение используется только для целей отладки. Для официальных репозиториев необходимо использовать значение TrustedOnly .
Инициализация связки ключей
Для инициализации связки ключей pacman выполните:
# pacman-key --init
Управление связкой ключей
Проверка мастер-ключей
Первоначальная настройка ключей выполняется командой:
# pacman-key --populate
При появлении запроса необходимо проверить подлинность мастер-ключей, поскольку они используются для подписи всех пакетов совместно с ключами разработчиков.
PGP-ключи довольно велики (2048 бит или больше), что делает их неудобными для восприятия людьми. Поэтому на основе ключа вычисляется 40-разрядная шестнадцатеричная хэш-сумма, по которой можно проверить его подлинность. Также нужно помнить, что последние восемь цифр хэш-суммы часто используют как имя или (короткий) ID ключа, а последние шестнадцать — как длинный ID ключа.
Добавление ключей разработчика
Ключи официальных разработчиков и сопровождающих пакетов подписываются мастер-ключами, так что вам не нужно использовать pacman-key, чтобы подписывать их самостоятельно. Когда pacman встречает в подписи пакета ключ, который не удаётся распознать, то предлагает скачать его с сервера ключей, указанного в параметре keyserver в файле /etc/pacman.d/gnupg/gpg.conf или в опции —keyserver командной строки. Перечень серверов ключей можно найти в Википедии.
Ключ разработчика нужно скачать всего единожды, после этого он будет использоваться для проверки любого пакета от этого разработчика.
Примечание: Пакет archlinux-keyring , являющийся зависимостью для pacman , содержит самые свежие на момент последнего обновления ключи. При необходимости ключи можно также обновить вручную командой pacman-key —refresh-keys с правами root. При выполнении этой команды pacman-key попытается найти на сервере ключей также и ваш локальный ключ, после чего выдаст сообщение, что ключ не найден — это нормально.
Добавление неофициальных ключей
Этим способом можно добавить в связку ключей pacman свой ключ или включить подписанный неофициальный репозиторий.
В первую очередь получите у владельца ключа его ID ( keyid ). Добавьте полученный ключ в связку:
-
Если ключ находится на сервере ключей, импортируйте его командой:
# pacman-key --recv-keys keyid
# pacman-key --add /путь/к/скачанному/файлу/ключа
Всегда старайтесь проверять отпечаток — как мастер-ключей, так любых других ключей, которые вы собираетесь подписать:
$ pacman-key --finger keyid
Наконец, подпишите импортированный ключ локально:
# pacman-key --lsign-key keyid
Теперь этот ключ будет считаться доверенным.
Отладка при помощи gpg
При отладке доступ к связке ключей pacman можно получить напрямую с помощью gpg, например:
# gpg --homedir /etc/pacman.d/gnupg --list-keys
Советы и рекомендации
Регулярно обновляйте систему
Регулярное обновление системы позволяет избежать большинства ошибок, связанных с подписью. Если вы вынуждены отложить обновление на длительный срок, то перед обновлением системы синхронизируйте базу данных пакетов вручную и обновите пакет archlinux-keyring :
# pacman -Sy archlinux-keyring && pacman -Su
Эта команда не считается частичным обновлением, поскольку сначала синхронизируется база данных пакетов и обновляется пакет с ключами. Обе команды должны быть выполнены непосредственно перед началом обновления системы для работы проверки подписей всех обновляемых пакетов.
Примечание: С 2022 года созданы и включены по умолчанию служба archlinux-keyring-wkd-sync.service и связанный с ней systemd-таймер, который запускает получение новых ключей раз в неделю и таким образом решает проблему signature from «Some Developer developer_email@archlinux.org>» is marginal trust (например, BBS#278332) без вмешательства пользователя.
Регулярно синхронизируйте системные часы
Если время в системе будет неправильным, подписи могут считаться просроченными (или недействительными), и проверка подписи пакетов окончится неудачей. Регулярно синхронизируйте системные часы с помощью Network Time Protocol.
Решение проблем
Подпись некорректна
Работа pacman-key зависит от настроек системного времени. Если системные часы неверны, при обновлении вы получите следующую ошибку:
ошибка: НазваниеПакета: подпись от "Пользователь " некорректна ошибка: не удалось завершить транзакцию (неверный или поврежденный пакет) Обнаружены ошибки, пакеты не обновлены.
Проверьте правильность системного времени. Например, если вы используете ntpd, выполните синхронизацию времени командами ntpd -qg и hwclock -w (запускайте от имени root).
Если системное время правильное, а ошибка всё равно есть, попробуйте следующее:
Удаление пакетов из кэша
Пакеты могли оказаться повреждены или не подписаны. Попробуйте удалить каждый проблемный пакет из кэша командой rm /var/cache/pacman/pkg/плохой_пакет* или сделайте полную очистку кэша, чтобы пакеты скачались заново.
Сброс ключей
Для сброса всех установленных в системе ключей удалите каталог /etc/pacman.d/gnupg . После этого выполните команды pacman-key —init и pacman-key —populate , чтобы добавить базовый набор ключей заново.
Отключение проверки подписи
Важно: Используйте с осторожностью. Отключение проверки подписи приведёт к тому, что pacman будет без возражений устанавливать любые пакеты, в том числе и недоверенные.
Если подписи пакетов вас не интересуют, можно полностью отключить их проверку. Отредактируйте файл /etc/pacman.conf , раскомментировав следующую строку в разделе [options] :
SigLevel = Never #LocalFileSigLevel = Optional #RemoteFileSigLevel = Required
Также необходимо закомментировать все параметры SigLevel в настройках репозиториев, потому что они имеют приоритет над глобальными настройками. В результате подпись пакетов проверяться не будет, как это было в pacman до четвёртой версии. В этом случае устанавливать связку ключей при помощи pacman-key не нужно. Позже при необходимости можно будет включить проверку подписи пакетов обратно.
Не удаётся импортировать ключи
- Устаревший пакет archlinux-keyring ;
- Неправильные настройки даты и времени;
- Интернет-провайдер блокирует порт, используемый для импорта PGP-ключей;
- Кэш pacman содержит неподписанные пакеты, оставшиеся с предыдущих попыток;
- Демон dirmngr не был правильно настроен.
Давно не обновлявшийся пакет archlinux-keyring может привести к проблемам при синхронизации обновлений.
Ниже приведено несколько возможных решений.
Обновление системы
Прежде всего попробуйте обновить систему.
Смена сервера ключей
Если вы предполагаете, что проблема связана с сервером ключей, то можно попробовать переключиться на сервер ключей Ubuntu. Отредактируйте файл /etc/pacman.d/gnupg/gpg.conf , изменив значение keyserver :
keyserver hkp://keyserver.ubuntu.com
Удаление кэшированных пакетов
Возможно, кэш pacman в каталоге /var/cache/pacman/pkg/ содержит неподписанные пакеты. Очистите кеш вручную:
# pacman -Sc
что удалит все пакеты в кэше, которые не были установлены.
Не удаётся опознать подпись пакета
Иногда при выполнении pacman -Syu вы можете столкнуться со следующей ошибкой:
error: название_пакета: signature from "создатель_пакета" is unknown trust
Такое происходит, когда ключ создателя пакета отсутствует в локальной базе данных pacman-key или не является доверенным. Pacman не всегда имеет возможность проверить, был ли ключ скачан и является ли он доверенным, перед тем как продолжить обновление. Также возможно, что срок действия ключа истёк.
- Вручную обновить пакет archlinux-keyring перед обновлением системы;
- обновить ключи командой pacman-key —refresh-keys ;
- сбросить ключи;
- вручную подписать недоверенный ключ локально (не рекомендуется);
- временно установить параметр SigLevel в значение TrustAll (не рекомендуется).
Последние два варианта ломают цепочку доверия и должны использоваться с осторожностью.
Обновление ключей через прокси
Чтобы можно было обновлять ключи через прокси-сервер, задайте параметр honor-http-proxy в файлах /etc/gnupg/dirmngr.conf и /etc/pacman.d/gnupg/dirmngr.conf . Подробнее смотрите GnuPG (Русский)#Использование сервера ключей.
Примечание: Если pacman-key был запущен без опции honor-http-proxy и всё равно завершился с ошибкой, попробуйте перезагрузиться.
Смотрите также
- DeveloperWiki:Package Signing Proposal for Pacman
- Pacman Package Signing – 1: Makepkg and Repo-add
- Pacman Package Signing – 2: Pacman-key
- Pacman Package Signing – 3: Pacman
- Pacman Package Signing – 4: Arch Linux
Установка
ClickHouse может работать на любой операционной системе Linux, FreeBSD или Mac OS X с архитектурой процессора x86-64, AArch64 или PowerPC64LE.
Предварительно собранные пакеты компилируются для x86-64 и используют набор инструкций SSE 4.2, поэтому, если не указано иное, его поддержка в используемом процессоре, становится дополнительным требованием к системе. Вот команда, чтобы проверить, поддерживает ли текущий процессор SSE 4.2:
grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
Чтобы запустить ClickHouse на процессорах, которые не поддерживают SSE 4.2, либо имеют архитектуру AArch64 или PowerPC64LE, необходимо самостоятельно собрать ClickHouse из исходного кода с соответствующими настройками конфигурации.
Доступные варианты установки
Из deb-пакетов
Яндекс рекомендует использовать официальные скомпилированные deb -пакеты для Debian или Ubuntu. Для установки пакетов выполните:
sudo apt-get install -y apt-transport-https ca-certificates dirmngr sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 8919F6BD2B48D754 echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \ /etc/apt/sources.list.d/clickhouse.list sudo apt-get update sudo apt-get install -y clickhouse-server clickhouse-client sudo service clickhouse-server start clickhouse-client # or "clickhouse-client --password" if you've set up a password.
Устаревший способ установки deb-пакетов
sudo apt-get install apt-transport-https ca-certificates dirmngr sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 echo "deb https://repo.clickhouse.com/deb/stable/ main/" | sudo tee \ /etc/apt/sources.list.d/clickhouse.list sudo apt-get update sudo apt-get install -y clickhouse-server clickhouse-client sudo service clickhouse-server start clickhouse-client # or "clickhouse-client --password" if you set up a password.
Чтобы использовать различные версии ClickHouse в зависимости от ваших потребностей, вы можете заменить stable на lts или testing .
Также вы можете вручную скачать и установить пакеты из репозитория.
Пакеты
- clickhouse-common-static — устанавливает исполняемые файлы ClickHouse.
- clickhouse-server — создаёт символические ссылки для clickhouse-server и устанавливает конфигурационные файлы.
- clickhouse-client — создаёт символические ссылки для clickhouse-client и других клиентских инструментов и устанавливает конфигурационные файлы clickhouse-client .
- clickhouse-common-static-dbg — устанавливает исполняемые файлы ClickHouse собранные с отладочной информацией.
Если вам нужно установить ClickHouse определённой версии, вы должны установить все пакеты одной версии: sudo apt-get install clickhouse-server=21.8.5.7 clickhouse-client=21.8.5.7 clickhouse-common-static=21.8.5.7
Из rpm-пакетов
Команда ClickHouse в Яндексе рекомендует использовать официальные предкомпилированные rpm -пакеты для CentOS, RedHat и всех остальных дистрибутивов Linux, основанных на rpm.
Установка официального репозитория
Сначала нужно подключить официальный репозиторий:
sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
Для систем с пакетным менеджером zypper (openSUSE, SLES):
sudo zypper addrepo -r https://packages.clickhouse.com/rpm/clickhouse.repo -g sudo zypper --gpg-auto-import-keys refresh clickhouse-stable
Далее любая команда yum install может быть заменена на zypper install . Чтобы указать желаемую версию, необходимо добавить -$VERSION в имени пакета, например clickhouse-client-22.2.2.22 .
Установка сервера и клиента
sudo yum install -y clickhouse-server clickhouse-client
Запуск сервера
sudo systemctl enable clickhouse-server sudo systemctl start clickhouse-server sudo systemctl status clickhouse-server clickhouse-client # илм "clickhouse-client --password" если установлен пароль
Устаревший способ установки rpm-пакетов
sudo yum install yum-utils sudo rpm --import https://repo.clickhouse.com/CLICKHOUSE-KEY.GPG sudo yum-config-manager --add-repo https://repo.clickhouse.com/rpm/clickhouse.repo sudo yum install clickhouse-server clickhouse-client sudo /etc/init.d/clickhouse-server start clickhouse-client # or "clickhouse-client --password" if you set up a password.
Для использования наиболее свежих версий нужно заменить stable на testing (рекомендуется для тестовых окружений). Также иногда доступен prestable .
Для непосредственной установки пакетов необходимо выполнить следующие команды:
sudo yum install clickhouse-server clickhouse-client
Также есть возможность установить пакеты вручную, скачав отсюда: https://packages.clickhouse.com/rpm/stable.
Из tgz-архивов
Команда ClickHouse в Яндексе рекомендует использовать предкомпилированные бинарники из tgz -архивов для всех дистрибутивов, где невозможна установка deb — и rpm — пакетов.
Интересующую версию архивов можно скачать вручную с помощью curl или wget из репозитория https://packages.clickhouse.com/tgz/. После этого архивы нужно распаковать и воспользоваться скриптами установки. Пример установки самой свежей версии:
LATEST_VERSION=$(curl -s https://packages.clickhouse.com/tgz/stable/ | \ grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -V -r | head -n 1) export LATEST_VERSION case $(uname -m) in x86_64) ARCH=amd64 ;; aarch64) ARCH=arm64 ;; *) echo "Unknown architecture $(uname -m)"; exit 1 ;; esac for PKG in clickhouse-common-static clickhouse-common-static-dbg clickhouse-server clickhouse-client do curl -fO "https://packages.clickhouse.com/tgz/stable/$PKG-$LATEST_VERSION-$ .tgz" \ || curl -fO "https://packages.clickhouse.com/tgz/stable/$PKG-$LATEST_VERSION.tgz" done tar -xzvf "clickhouse-common-static-$LATEST_VERSION-$ .tgz" \ || tar -xzvf "clickhouse-common-static-$LATEST_VERSION.tgz" sudo "clickhouse-common-static-$LATEST_VERSION/install/doinst.sh" tar -xzvf "clickhouse-common-static-dbg-$LATEST_VERSION-$ .tgz" \ || tar -xzvf "clickhouse-common-static-dbg-$LATEST_VERSION.tgz" sudo "clickhouse-common-static-dbg-$LATEST_VERSION/install/doinst.sh" tar -xzvf "clickhouse-server-$LATEST_VERSION-$ .tgz" \ || tar -xzvf "clickhouse-server-$LATEST_VERSION.tgz" sudo "clickhouse-server-$LATEST_VERSION/install/doinst.sh" configure sudo /etc/init.d/clickhouse-server start tar -xzvf "clickhouse-client-$LATEST_VERSION-$ .tgz" \ || tar -xzvf "clickhouse-client-$LATEST_VERSION.tgz" sudo "clickhouse-client-$LATEST_VERSION/install/doinst.sh"
Устаревший способ установки из архивов tgz
export LATEST_VERSION=$(curl -s https://repo.clickhouse.com/tgz/stable/ | \ grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' | sort -V -r | head -n 1) curl -O https://repo.clickhouse.com/tgz/stable/clickhouse-common-static-$LATEST_VERSION.tgz curl -O https://repo.clickhouse.com/tgz/stable/clickhouse-common-static-dbg-$LATEST_VERSION.tgz curl -O https://repo.clickhouse.com/tgz/stable/clickhouse-server-$LATEST_VERSION.tgz curl -O https://repo.clickhouse.com/tgz/stable/clickhouse-client-$LATEST_VERSION.tgz tar -xzvf clickhouse-common-static-$LATEST_VERSION.tgz sudo clickhouse-common-static-$LATEST_VERSION/install/doinst.sh tar -xzvf clickhouse-common-static-dbg-$LATEST_VERSION.tgz sudo clickhouse-common-static-dbg-$LATEST_VERSION/install/doinst.sh tar -xzvf clickhouse-server-$LATEST_VERSION.tgz sudo clickhouse-server-$LATEST_VERSION/install/doinst.sh sudo /etc/init.d/clickhouse-server start tar -xzvf clickhouse-client-$LATEST_VERSION.tgz sudo clickhouse-client-$LATEST_VERSION/install/doinst.sh
Для продуктивных окружений рекомендуется использовать последнюю stable -версию. Её номер также можно найти на github с на вкладке https://github.com/ClickHouse/ClickHouse/tags c постфиксом -stable .
Из Docker образа
Для запуска ClickHouse в Docker нужно следовать инструкции на Docker Hub. Внутри образов используются официальные deb -пакеты.
Из единого бинарного файла
Для установки ClickHouse под Linux можно использовать единый переносимый бинарный файл из последнего коммита ветки master : [https://builds.clickhouse.com/master/amd64/clickhouse] .
curl -O 'https://builds.clickhouse.com/master/amd64/clickhouse' && chmod a+x clickhouse sudo ./clickhouse install
Из исполняемых файлов для нестандартных окружений
Для других операционных систем и архитектуры AArch64 сборки ClickHouse предоставляются в виде кросс-компилированного бинарного файла из последнего коммита ветки master (с задержкой в несколько часов).
- macOS — curl -O ‘https://builds.clickhouse.com/master/macos/clickhouse’ && chmod a+x ./clickhouse
- FreeBSD — curl -O ‘https://builds.clickhouse.com/master/freebsd/clickhouse’ && chmod a+x ./clickhouse
- AArch64 — curl -O ‘https://builds.clickhouse.com/master/aarch64/clickhouse’ && chmod a+x ./clickhouse
После скачивания можно воспользоваться clickhouse client для подключения к серверу или clickhouse local для обработки локальных данных.
Чтобы установить ClickHouse в рамках всей системы (с необходимыми конфигурационными файлами, настройками пользователей и т. д.), выполните sudo ./clickhouse install . Затем выполните команды clickhouse start (чтобы запустить сервер) и clickhouse-client (чтобы подключиться к нему).
Данные сборки не рекомендуются для использования в рабочей среде, так как они недостаточно тщательно протестированы. Также в них присутствуют не все возможности ClickHouse.
Из исходного кода
Для компиляции ClickHouse вручную используйте инструкцию для Linux или Mac OS X.
Можно скомпилировать пакеты и установить их, либо использовать программы без установки пакетов. Также при ручой сборке можно отключить необходимость поддержки набора инструкций SSE 4.2 или собрать под процессоры архитектуры AArch64.
Client: programs/clickhouse-client Server: programs/clickhouse-server
Для работы собранного вручную сервера необходимо создать каталоги для данных и метаданных, а также сделать сменить их владельца на желаемого пользователя ( chown ). Пути к этим каталогам могут быть изменены в конфигурационном файле сервера (src/programs/server/config.xml), по умолчанию используются следующие:
/opt/clickhouse/data/default/ /opt/clickhouse/metadata/default/
На Gentoo для установки ClickHouse из исходного кода можно использовать просто emerge clickhouse .
Запуск
Для запуска сервера в режиме демона, выполните:
sudo service clickhouse-server start
Смотрите журналы в каталоге /var/log/clickhouse-server/ .
Если сервер не стартует, проверьте корректность конфигурации в файле /etc/clickhouse-server/config.xml
Также можно запустить сервер вручную из консоли:
clickhouse-server --config-file=/etc/clickhouse-server/config.xml
При этом журнал будет выводиться в консоль, что удобно для разработки. Если конфигурационный файл лежит в текущем каталоге, то указывать параметр —config-file не требуется, по умолчанию будет использован файл ./config.xml .
После запуска сервера соединиться с ним можно с помощью клиента командной строки:
clickhouse-client
По умолчанию он соединяется с localhost:9000 от имени пользователя default без пароля. Также клиент может быть использован для соединения с удалённым сервером с помощью аргумента —host .
Терминал должен использовать кодировку UTF-8.
Более подробная информация о клиенте располагается в разделе «Клиент командной строки».
Пример проверки работоспособности системы:
$ ./clickhouse-client ClickHouse client version 0.0.18749. Connecting to localhost:9000. Connected to ClickHouse server version 0.0.18749. :) SELECT 1 SELECT 1 ┌─1─┐ │ 1 │ └───┘ 1 rows in set. Elapsed: 0.003 sec. :)
Поздравляем, система работает!
Для дальнейших экспериментов можно попробовать загрузить один из тестовых наборов данных или пройти пошаговое руководство для начинающих.
Data Object. Data Свойство
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает или задает значение данных текущего объекта DataObject.
public: property System::Xml::XmlNodeList ^ Data < System::Xml::XmlNodeList ^ get(); void set(System::Xml::XmlNodeList ^ value); >;
public System.Xml.XmlNodeList Data
member this.Data : System.Xml.XmlNodeList with get, set
Public Property Data As XmlNodeList
Значение свойства
Данные текущего объекта DataObject.
Исключения
Значение, используемое для задания свойства, равно null .
Примеры
В следующем примере кода показано, как создать завитую XML-сигнатуру.
#using #using #using using namespace System; using namespace System::IO; using namespace System::Security::Cryptography; using namespace System::Security::Cryptography::Xml; using namespace System::Xml; int main() < // Create example data to sign. XmlDocument^ document = gcnew XmlDocument; XmlNode^ node = document->CreateNode( XmlNodeType::Element, "", "MyElement", "samples" ); node->InnerText = "This is some text"; document->AppendChild( node ); Console::Error->WriteLine( "Data to sign:\n\n", document->OuterXml ); // Create the SignedXml message. SignedXml^ signedXml = gcnew SignedXml; RSA^ key = RSA::Create(); signedXml->SigningKey = key; // Create a data object to hold the data to sign. DataObject^ dataObject = gcnew DataObject; dataObject->Data = document->ChildNodes; dataObject->Id = "MyObjectId"; // Add the data object to the signature. signedXml->AddObject( dataObject ); // Create a reference to be able to package everything into the // message. Reference^ reference = gcnew Reference; reference->Uri = "#MyObjectId"; // Add it to the message. signedXml->AddReference( reference ); // Add a KeyInfo. KeyInfo^ keyInfo = gcnew KeyInfo; keyInfo->AddClause( gcnew RSAKeyValue( key ) ); signedXml->KeyInfo = keyInfo; // Compute the signature. signedXml->ComputeSignature(); // Get the XML representation of the signature. XmlElement^ xmlSignature = signedXml->GetXml(); Console::WriteLine( xmlSignature->OuterXml ); >
using System; using System.IO; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.Xml; public class XMLdsigsample1 < static void Main(String[] args) < // Create example data to sign. XmlDocument document = new XmlDocument(); XmlNode node = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples"); node.InnerText = "This is some text"; document.AppendChild(node); Console.Error.WriteLine("Data to sign:\n" + document.OuterXml + "\n"); // Create the SignedXml message. SignedXml signedXml = new SignedXml(); RSA key = RSA.Create(); signedXml.SigningKey = key; // Create a data object to hold the data to sign. DataObject dataObject = new DataObject(); dataObject.Data = document.ChildNodes; dataObject.Id = "MyObjectId"; // Add the data object to the signature. signedXml.AddObject(dataObject); // Create a reference to be able to package everything into the // message. Reference reference = new Reference(); reference.Uri = "#MyObjectId"; // Add it to the message. signedXml.AddReference(reference); // Add a KeyInfo. KeyInfo keyInfo = new KeyInfo(); keyInfo.AddClause(new RSAKeyValue(key)); signedXml.KeyInfo = keyInfo; // Compute the signature. signedXml.ComputeSignature(); // Get the XML representation of the signature. XmlElement xmlSignature = signedXml.GetXml(); Console.WriteLine(xmlSignature.OuterXml); >>
Imports System.IO Imports System.Security.Cryptography Imports System.Security.Cryptography.Xml Imports System.Xml _ Public Class XMLdsigsample1 Shared Sub Main(args() As [String]) ' Create example data to sign. Dim document As New XmlDocument() Dim node As XmlNode = document.CreateNode(XmlNodeType.Element, "", "MyElement", "samples") node.InnerText = "This is some text" document.AppendChild(node) Console.Error.WriteLine("Data to sign:") Console.Error.WriteLine() Console.Error.WriteLine(document.OuterXml) Console.Error.WriteLine() ' Create the SignedXml message. Dim signedXml As New SignedXml() Dim key As RSA = RSA.Create() signedXml.SigningKey = key ' Create a data object to hold the data to sign. Dim dataObject As New DataObject() dataObject.Data = document.ChildNodes dataObject.Id = "MyObjectId" ' Add the data object to the signature. signedXml.AddObject(dataObject) ' Create a reference to be able to package everything into the ' message. Dim reference As New Reference() reference.Uri = "#MyObjectId" ' Add it to the message. signedXml.AddReference(reference) ' Add a KeyInfo. Dim keyInfo As New KeyInfo() keyInfo.AddClause(New RSAKeyValue(key)) signedXml.KeyInfo = keyInfo ' Compute the signature. signedXml.ComputeSignature() ' Get the XML representation of the signature. Dim xmlSignature As XmlElement = signedXml.GetXml() Console.WriteLine(xmlSignature.OuterXml) End Sub End Class
В следующем примере кода показано, как проверить xml-сигнатуру.
#using #using #using using namespace System; using namespace System::Security::Cryptography; using namespace System::Security::Cryptography::Xml; using namespace System::IO; using namespace System::Xml; int main() < array^args = System::Environment::GetCommandLineArgs(); Console::WriteLine( "Verifying . ", args[ 1 ] ); // Create a SignedXml. SignedXml^ signedXml = gcnew SignedXml; // Load the XML. XmlDocument^ xmlDocument = gcnew XmlDocument; xmlDocument->PreserveWhitespace = true; xmlDocument->Load( gcnew XmlTextReader( args[ 1 ] ) ); XmlNodeList^ nodeList = xmlDocument->GetElementsByTagName( "Signature" ); signedXml->LoadXml( safe_cast(nodeList[ 0 ]) ); if ( signedXml->CheckSignature() ) < Console::WriteLine( "Signature check OK" ); >else < Console::WriteLine( "Signature check FAILED" ); >>
using System; using System.Security.Cryptography; using System.Security.Cryptography.Xml; using System.IO; using System.Xml; public class Verify < public static void Main(String[] args) < Console.WriteLine("Verifying " + args[0] + ". "); // Create a SignedXml. SignedXml signedXml = new SignedXml(); // Load the XML. XmlDocument xmlDocument = new XmlDocument(); xmlDocument.PreserveWhitespace = true; xmlDocument.Load(new XmlTextReader(args[0])); XmlNodeList nodeList = xmlDocument.GetElementsByTagName("Signature"); signedXml.LoadXml((XmlElement)nodeList[0]); if (signedXml.CheckSignature()) < Console.WriteLine("Signature check OK"); >else < Console.WriteLine("Signature check FAILED"); >> >
Imports System.Security.Cryptography Imports System.Security.Cryptography.Xml Imports System.IO Imports System.Xml _ Public Class Verify Public Shared Sub Main(args() As [String]) Console.WriteLine(("Verifying " + args(0) + ". ")) ' Create a SignedXml. Dim signedXml As New SignedXml() ' Load the XML. Dim xmlDocument As New XmlDocument() xmlDocument.PreserveWhitespace = True xmlDocument.Load(New XmlTextReader(args(0))) Dim nodeList As XmlNodeList = xmlDocument.GetElementsByTagName("Signature") signedXml.LoadXml(CType(nodeList(0), XmlElement)) If signedXml.CheckSignature() Then Console.WriteLine("Signature check OK") Else Console.WriteLine("Signature check FAILED") End If End Sub End Class
Комментарии
Это свойство представляет собой список узлов XML, содержащий элемент, описанный в свойстве Id .
Основные команды bash, git, npm и yarn, а также немного о package.json и semver
Предлагаю вашему вниманию небольшую шпаргалку по основным командам bash, git, npm, yarn, package.json и semver.
Условные обозначения: [dir-name] — означает название директории, | — означает «или».
Рекомендую вводить каждую команду в терминале и внимательно изучать вывод, так вы быстро их запомните и определите, какие команды вам нужны, а какие нет.
Приношу извинения за возможные ошибки и опечатки. Буду рад любым замечаниям и предложениям.
Без дальнейших предисловий.
bash
bash представляет собой инструмент командной строки, позволяющий выполнять некоторые распространенные действия.
Установка: в моем случае bash был установлен вместе с git.
help
history
clear
Выход из терминала:
exit
// make directory mkdir [dir-name] // пример mkdir my-app // несколько диреторий mkdir -p // несколько вложенных директорий mkdir -p my-app/
// change directory cd [dir-name] // пример cd my-app // сразу после создания cd !$ // родительская директория cd .. // на два уровня выше cd ../.. // предыдущая директория cd - // домашняя директория cd ~
Путь к текущей директории:
// print work directory pwd
// list ls // включая скрытые файлы ls -a | -f // больше информации // например, права доступа ls -l
touch [file-name] // пример touch index.html // несколько файлов touch my-app/
cat [file-name] // пример cat index.html // сортировка и выборка уникальных значений cat [file-name] | sort | uniq // меньше контента less [file-name] // q - exit // n строк с начала файла head -50 [file-name] // n строк с конца файла tail -50 [file-name] // поиск слова grep [string] [file-name] // распаковка и просмотр содержимого архива unzip [achive-name] // тип файла file [file-name]
Копирование, перемещение и удаление файла:
// copy cp [file1] [file2] // move mv [file1] [file2] // пример // перемещение всех файлов из одной директории в другую mv [dir1]/*.* [dir2] // remove rm [file-name] // удаление пустой директории rmdir [dir-name] // удаление непустой директории rm -r [dir-name] // или rm -rf [dir-name]
Вывод в терминал строки:
echo [string] // пример echo hello // создание или перезапись файла echo hello > greet.txt // добавление строки в файл echo hello >> greet.txt
wget [url]
true && echo hello false || echo hello echo hello ; ls
// количество переносов строки - \n cat [file] | wc -l
git
git представляет собой распределенную систему контроля версий, позволяющую контролировать процесс внесения изменений в проект.
git --version
git help git help [command-name] git [command-name] --help | -h
// --local - настройки для текущего репо // --global - настройки для текущего пользователя // --system - настройки для всей системы, т.е. для всех пользователей git config --global user.name "My Name" git config --global user.email "myemail@example.com"
// список глобальных настроек git config --list | -l --global // редактирование глобальных настроек git config --global --edit | -e
git init
// -d - включая директории, -x - включая игнорируемые файлы, -f - принудительная git clean | -dxf
Удаление файлов и директорий:
// remove git rm [file-name] git rm -r [dir-name] git rm --force | -f
// git add + git remove // move git mv [old-file] [new-file]
Просмотр состояния репозитория:
git status
git add [file-name] git add --force | -f // все файлы git add . | --all | -A // для добавления пустой директории можно создать в ней пустой файл .gitkeep
Добавление сообщения (коммита):
// редактирование коммита git commit // коммит для одного изменения, если не выполнялось git add . | -A // если выполнялось, сообщение будет добавлено для всех изменений git commit --message | -m "My Message" // для всех изменений, если git add [file-name] выполнялось несколько раз git commit --all | -a -m | -am "My Message" // исправление коммита git commit --amend "My Message" | --no-edit
// последний коммит git show // другой коммит git show [hash] // минимум первые 4 символа // поиск изменений по сообщению или части сообщения git show :/[string] // поиск коммита по тегу git show [tag-name]
Просмотр разницы между коммитами:
git diff HEAD | @ // HEAD - как правило, текущая ветка; @ - алиас для HEAD // staged git diff --staged | --cached git diff [hash1] [hash2] // разница между ветками git diff [branch1]. [branch2] // просмотр разницы между коммитами при редактировании сообщения git commit --verbose | -v // кастомизация выводимого сообщения git diff --word-diff | --color-words
Просмотр истории изменений:
git log // n - количество изменений git log -n // --since, --after - после // --until, --before - до // разница git log -p // быстрое форматирование git log --graph --oneline --stat // кастомное форматирование git log --pretty=format // пример git log --pretty=format:'%C(red)%h %C(green)%cd %C(reset)| %C(blue)%s%d %C(yellow)[%an]' --date=short | format-local:'%F %R' // поиск изменений по слову, файлу, ветке; i - без учета регистра git log --grep | -G [string] | [file] | [branch] & -i // поиск по нескольким строкам git log --grep [string1] --grep [string2] --all-match // поиск в определенном блоке файла git log -L '//','//':index.html // поиск по автору git log --author=[name]
git reset // --hard - включая рабочую директорию и индекс // --soft - без рабочей директории и индекса // --mixed - по умолчанию: без рабочей директории, но с индексом git reset --hard [hash] | @~ // @~ - последний коммит в HEAD // аналогично git reset --hard ORIG_HEAD // не путать с переключением ветки git checkout git restore
Работа с ветками:
// список веток git branch // создание ветки git branch [branch-name] // переключение на ветку git checkout [branch-name] // branch + checkout git checkout -b [branch-name] // переименование git branch -m [old-branch] [new-branch] // удаление ветки git branch -d [branch-name] // слияние веток git merge [branch-name]
Разрешение конфликтов при слиянии:
// обычно, при возникновении конфликта, открывается редактор // принять изменения из сливаемой ветки git checkout --ours // принять изменения из текущей ветки git checkout --theirs // отмена слияния git reset --merge git merge --abort // получение дополнительной информации git checkout --conflict=diff3 --merge [file-name] // продолжить слияние git merge --continue
// клонирование git clone [url] & [dir] // просмотр git remote git remote show git remote add [shortname] [url] git remote rename [old-name] [new-name] // получение изменений // git fetch + git merge git pull // отправка изменений git push
// просмотр git tag // легковесная метка git tag [tag-name] //пример git tag v1-beta // аннотированная метка git tag -a v1 -m "My Version 1" // удаление git tag -d [tag-name]
git bisect git blame git grep
Сохранение незакоммиченных изменений:
// сохранение git stash // извлечение git stash pop
git cherry-pick | -x [hash] // если возник конфликт // отмена git cherry-pick --abort // продолжить git cherry-pick --continue git cherry-pick --no-commit | -n // --cherry = --cherry-mark --left-right --no-merges git log --oneline --cherry [branch1] [branch2]
git rebase [branch] // при возникновении конфликта // отмена git rebase --abort // пропустить git rebase --skip // продолжить git rebase --continue // предпочтение коммитов слияния git rebase --preserve-merges | -p // интерактивное перебазирование git rebase -i [branch]
Автозавершение повторных конфликтов:
// rerere - reuse recorder resolution // rerere.enabled true | false // rerere.autoUpdate true | false // rerere-train.sh - скрипт для обучения rerere git rerere forget [file-name]
git revert @ | [hash] // отмена слияния // git reset --hard @~ не сработает git revert [hash] -m 1 // git merge [branch] не сработает // отмена отмены git revert [hash] // повторное слияние с rebase git rebase [branch1] [branch2] | --onto [branch1] [hash] [branch2] git merge [branch] git rebase [hash] --no-ff
Пример алиасов (сокращений) для .gitconfig:
[alias] aa = add -A co = checkout ci = commit -m st = status br = branch
Пример .gitconfig:
[user] name = [My Name] email = [myemail@example.com] username = [myusername] [core] editor = [myeditor] whitespace = fix,-indent-with-non-tab,trailing-space,cr-at-eol pager = delta [web] browser = google-chrome [instaweb] httpd = apache2 -f [rerere] enabled = 1 autoupdate = 1 [push] default = matching [color] ui = auto [color "branch"] current = yellow bold local = green bold remote = cyan bold [color "diff"] meta = yellow bold frag = magenta bold old = red bold new = green bold whitespace = red reverse [color "status"] added = green bold changed = yellow bold untracked = red bold [difftool] prompt = false [delta] features = line-numbers decorations line-numbers = true [delta "decorations"] minus-style = red bold normal plus-style = green bold normal minus-emph-style = white bold red minus-non-emph-style = red bold normal plus-emph-style = white bold green plus-non-emph-style = green bold normal file-style = yellow bold none file-decoration-style = yellow box hunk-header-style = magenta bold hunk-header-decoration-style = magenta box minus-empty-line-marker-style = normal normal plus-empty-line-marker-style = normal normal line-numbers-right-format = "│ " [github] user = [username] token = token [gitflow "prefix"] versiontag = v [sequence] editor = interactive-rebase-tool [alias] a = add --all ai = add -i ### ap = apply as = apply --stat ac = apply --check ### ama = am --abort amr = am --resolved ams = am --skip ### b = branch ba = branch -a bd = branch -d bdd = branch -D br = branch -r bc = rev-parse --abbrev-ref HEAD bu = !git rev-parse --abbrev-ref --symbolic-full-name "@" bs = !git-branch-status ### c = commit ca = commit -a cm = commit -m cam = commit -am cem = commit --allow-empty -m cd = commit --amend cad = commit -a --amend ced = commit --allow-empty --amend ### cl = clone cld = clone --depth 1 clg = !sh -c 'git clone git://github.com/$1 $(basename $1)' - clgp = !sh -c 'git clone git@github.com:$1 $(basename $1)' - clgu = !sh -c 'git clone git@github.com:$(git config --get user.username)/$1 $1' - ### cp = cherry-pick cpa = cherry-pick --abort cpc = cherry-pick --continue ### d = diff dp = diff --patience dc = diff --cached dk = diff --check dck = diff --cached --check dt = difftool dct = difftool --cached ### f = fetch fo = fetch origin fu = fetch upstream ### fp = format-patch ### fk = fsck ### g = grep -p ### l = log --oneline lg = log --oneline --graph --decorate ### ls = ls-files lsf = !git ls-files | grep -i ### m = merge ma = merge --abort mc = merge --continue ms = merge --skip ### o = checkout om = checkout master ob = checkout -b opr = !sh -c 'git fo pull/$1/head:pr-$1 && git o pr-$1' ### pr = prune -v ### ps = push psf = push -f psu = push -u pst = push --tags ### pso = push origin psao = push --all origin psfo = push -f origin psuo = push -u origin ### psom = push origin master psaom = push --all origin master psfom = push -f origin master psuom = push -u origin master psoc = !git push origin $(git bc) psaoc = !git push --all origin $(git bc) psfoc = !git push -f origin $(git bc) psuoc = !git push -u origin $(git bc) psdc = !git push origin :$(git bc) ### pl = pull pb = pull --rebase ### plo = pull origin pbo = pull --rebase origin plom = pull origin master ploc = !git pull origin $(git bc) pbom = pull --rebase origin master pboc = !git pull --rebase origin $(git bc) ### plu = pull upstream plum = pull upstream master pluc = !git pull upstream $(git bc) pbum = pull --rebase upstream master pbuc = !git pull --rebase upstream $(git bc) ### rb = rebase rba = rebase --abort rbc = rebase --continue rbi = rebase --interactive rbs = rebase --skip ### re = reset rh = reset HEAD reh = reset --hard rem = reset --mixed res = reset --soft rehh = reset --hard HEAD remh = reset --mixed HEAD resh = reset --soft HEAD rehom = reset --hard origin/master ### r = remote ra = remote add rr = remote rm rv = remote -v rn = remote rename rp = remote prune rs = remote show rao = remote add origin rau = remote add upstream rro = remote remove origin rru = remote remove upstream rso = remote show origin rsu = remote show upstream rpo = remote prune origin rpu = remote prune upstream ### rmf = rm -f rmrf = rm -r -f ### s = status sb = status -s -b ### sa = stash apply sc = stash clear sd = stash drop sl = stash list sp = stash pop ss = stash save ssk = stash save -k sw = stash show st = !git stash list | wc -l 2>/dev/null | grep -oEi '[0-9][0-9]*' ### t = tag td = tag -d ### w = show wp = show -p wr = show -p --no-color ### svnr = svn rebase svnd = svn dcommit svnl = svn log --oneline --show-commit ### subadd = !sh -c 'git submodule add git://github.com/$1 $2/$(basename $1)' - subrm = !sh -c 'git submodule deinit -f -- $1 && rm -rf .git/modules/$1 && git rm -f $1' - subup = submodule update --init --recursive subpull = !git submodule foreach git pull --tags origin master ### assume = update-index --assume-unchanged unassume = update-index --no-assume-unchanged assumed = !git ls -v | grep ^h | cut -c 3- unassumeall = !git assumed | xargs git unassume assumeall = !git status -s | awk | xargs git assume ### bump = !sh -c 'git commit -am \"Version bump v$1\" && git psuoc && git release $1' - release = !sh -c 'git tag v$1 && git pst' - unrelease = !sh -c 'git tag -d v$1 && git pso :v$1' - merged = !sh -c 'git o master && git plom && git bd $1 && git rpo' - aliases = !git config -l | grep alias | cut -c 7- snap = !git stash save 'snapshot: $(date)' && git stash apply 'stash@' bare = !sh -c 'git symbolic-ref HEAD refs/heads/$1 && git rm --cached -r . && git clean -xfd' - whois = !sh -c 'git log -i -1 --author=\"$1\" --pretty=\"format:%an \"' - serve = daemon --reuseaddr --verbose --base-path=. --export-all ./.git ### behind = !git rev-list --left-only --count $(git bu). HEAD ahead = !git rev-list --right-only --count $(git bu). HEAD ### ours = "!f() < git checkout --ours $@ && git add $@; >; f" theirs = "!f() < git checkout --theirs $@ && git add $@; >; f" subrepo = !sh -c 'git filter-branch --prune-empty --subdirectory-filter $1 master' - human = name-rev --name-only --refs=refs/heads/* [filter "lfs"] clean = git-lfs clean -- %f smudge = git-lfs smudge -- %f process = git-lfs filter-process required = true
Пример .gitignore:
### Node ### # Logs logs npm-debug.log* yarn-debug.log* yarn-error.log* # Optional npm cache directory .npm # Dependency directories /node_modules /jspm_packages /bower_components # Yarn Integrity file .yarn-integrity # Optional eslint cache .eslintcache # dotenv environment variables file(s) .env .env.* #Build generated dist/ build/ # Serverless generated files .serverless/ ### SublimeText ### # cache files for sublime text *.tmlanguage.cache *.tmPreferences.cache *.stTheme.cache # workspace files are user-specific *.sublime-workspace # project files should be checked into the repository, unless a significant # proportion of contributors will probably not be using SublimeText # *.sublime-project ### VisualStudioCode ### .vscode/* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json ### Vim ### *.sw[a-p] ### WebStorm/IntelliJ ### /.idea modules.xml *.ipr *.iml ### System Files ### *.DS_Store # Windows thumbnail cache files Thumbs.db ehthumbs.db ehthumbs_vista.db # Folder config file Desktop.ini # Recycle Bin used on file shares $RECYCLE.BIN/ # Thumbnails ._* # Files that might appear in the root of a volume .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent
npm
npm представляет собой пакетный менеджер, позволяющий устанавливать зависимости проекта.
npm устанавливается вместе с Node.js.
Также вместе с Node.js устанавливается npx, позволяющий запускать исполняемые файлы без установки: npx create-react-app my-app.
node --version | -v npm --version | -v
npm i -g npm@latest
Список доступных команд:
npm help npm help [command-name]
npm init // auto npm init --yes | -y
npm install | i // проверка конкретной зависимости npm explore [package-name] // проверка всех зависимостей npm doctor // очистка npm ci
Принудительная переустановка зависимостей:
npm i --force | -f
Установка только продакшн-пакетов:
npm i --only=production | --only=prod
npm i [package-name] npm i [package-name@version] // пример npm i express
Добавление зависимости для разработки:
npm i --save-dev | -D [package-name] // пример npm i -D nodemon
npm update | up [package-name]
// dependency npm remove | rm | r [package-name] // devDependency npm r -D [package-name]
Глобальная установка/обновление/удаление пакета:
npm i/up/r -g [package-name] // пример npm i -g create-react-app // использование create-react-app my-app
Определение устаревших пакетов:
npm outdated npm outdated [package-name]
Список установленных зависимостей:
npm list | ls // top level npm ls --depth=0 | --depth 0 // global + top level npm ls -g --depth 0
Информация о пакете:
npm view | v [package-name] // пример npm v react npm v react.description
Запуск скрипта/выполнение команды:
npm run [script] // пример // package.json: "scripts": < "dev": "nodemon server.js" >npm run dev // script start или node server.js npm start npm stop
Удаление дублирующихся пакетов:
npm dedupe | ddp
Удаление посторонних пакетов:
npm prune
Обнаружение уязвимостей (угроз безопасности):
npm audit // json npm audit --json // plain text npm audit --parseable
Автоматическое исправление уязвимостей:
npm audit fix
yarn
yarn, как и npm, представляет собой пакетный менеджер, позволяющий устанавливать зависимости проекта.
npm i -g yarn
Команда «yarn dlx» позволяет запускать исполняемые файлы без установки: yarn dlx create-react-app my-app. Для этого yarn необходимо обновить до второй версии: yarn set version berry.
yarn --version | -v
yarn set version latest
Список доступных команд:
yarn help yarn help [command-name]
yarn init // auto yarn init --yes | -y // "private": true в package.json yarn init --private | -p // auto + private yarn init -yp
yarn // или yarn install // тихая установка yarn install --silent | -s // проверка yarn --check-files
Принудительная переустановка зависимостей:
yarn install --force
Установка только продакшн-пакетов:
yarn install --production | --prod
yarn add [package-name] yarn add [package-name@version] // пример yarn add express // тихая установка yarn add --silent // или yarn add -s
Добавление зависимости для разработки:
yarn add --dev | -D [package-name] // пример yarn add -D nodemon
yarn upgrade [package-name]
yarn remove [package-name]
Глобальная установка/обновление/удаление пакета:
yarn global add/upgrade/remove [package-name] // пример yarn global add create-react-app // использование create-react-app my-app
Список установленных зависимостей:
yarn list // top level yarn list --depth=0 | --depth 0
Информация о пакете:
yarn info [package-name] // или yarn why [package-name] // пример yarn info react yarn info react description yarn why webpack
Запуск скрипта/выполнение команды:
yarn [script] // или yarn run [script] // пример // package.json: "scripts": < "dev": "nodemon server.js" >yarn dev
package.json
< "name": "my-app", "version": "1.0.0", "description": "my awesome app", "keywords": [ "amazing", "awesome", "best" ], "private": true, "main": "server.js", "license": "MIT", "homepage": "https://my-website.com", "repository": < "type": "git", "url": "https://github.com/user/repo.git" >, "repository": "github:user/repo", "author": < "name": "My Name", "email": "myemail@example.com", "url": "https://my-website.com" >, "author": "My Name (https://my-website.com)", "contributers": [ < "name": "Friend Name", "email": "friendemail@example.com", "url": "https://friend-website.com" >], "contributors": "Friend Name (https://friend-website.com)", "dependencies": < "express": "^4.17.1" >, "devDependencies": < "nodemon": "^2.0.4" >, "scripts": < "start": "react-scripts start", "dev": "nodemon server.js" >>
- name — название проекта
- version — версия проекта (см. версионирование)
- description — описание проекта (зачем нужен пакет?)
- keywords — ключевые слова (облегчает поиск в реестре npm)
- private — установка значения в true предотвращает случайную публикацию пакета в реестре npm
- main — основная точка входа для функционирования проекта
- repository — ссылка на репозиторий (один из вариантов)
- author — автор проекта (один из вариантов)
- contributors — участники проекта (люди, внесшие вклад в проект)
- dependencies — зависимости проекта (пакеты, без которых приложение не будет работать)
- devDependencies — зависимости для разработки (пакеты, без которых приложение будет работать)
- scripts — команды (выполняемые сценарии, задачи), предназначенные для автоматизации, например, команда «yarn dev» запустит скрипт «nodemon server.js»
Файлы «package-lock.json» и «yarn.lock» содержат более полную информацию об установленных пакетах, чем package.json, например, конкретные версии пакетов вместо диапазона допустимых версий.
Версионирование
Каждый пакет имеет версию, состоящую из трех цифр (например, 1.0.0), где первая цифра — мажорная версия (major), вторая — минорная версия (minor), третья — патчевая версия (патч, patch). Выпуск новой версии называется релизом.
Увеличение каждой из этих цифр согласно правилам семантического версионирования (semver) означает следующее:
- major — внесение несовместимых с предыдущей версией изменений
- minor — новая функциональность, совместимая с предыдущей версией
- patch — исправление ошибок, незначительные улучшения