2017-01-27 11 views
1

я могу установить пакет с ракеткой:Установите ракетку пакет только если не установлена ​​

raco pkg install <pkg-name> 

Если пакет не установлен, то он устанавливает его. Если пакет уже установлен, он будет жаловаться, что пакет уже установлен. Хотя это нормально, есть ли лучший способ проверить, установлен ли пакет, и только попытаться установить его, если он еще не установлен?

Для контекста, я хочу это, потому что у меня есть проект (непакет) Racket, который зависит от установленных пакетов. Я мог бы поместить их в файл info.rkt, но, насколько я могу судить, они не будут установлены, если я не попытаюсь установить проект как пакет, который не имеет смысла для этого домена.

Итак, есть ли способ определить, установлен ли пакет Racket? Кроме того, могу ли я использовать эту информацию для установки пакета, если он еще не установлен?

ответ

1

Да, на самом деле вы можете. Если вы используете shell-программу или make-файл (в основном, используя инструмент raco pkg из командной строки), вы можете передать ему параметр --skip-installed. Это попытается установить пакет, если он еще не установлен. Таким образом, вы могли бы сделать что-то вроде этого в файле булава:

all: # Replace spaces here with tabs, because make... 
    raco pkg install --skip-installed <important-pkg> 
    <rest-of-makefile> 

С другой стороны, если вы ищете решение «в Ракетка», вы можете использовать функцию installed-pkg-table, чтобы получить хэш-таблицу, содержащую все установленные пакеты , Оттуда, достаточно легко сделать hash-has-key?, чтобы увидеть, находится ли пакет в таблице. Оттуда вы можете использовать pkg-install-command для установки пакета. Ваш общий код будет выглядеть примерно так:

(unless (hash-has-key? (installed-pkg-table) "<important-pkg>") 
    (pkg-install-command #:deps 'search-auto i)) 

Я хотел бы отметить, что существует небольшая вероятность того, что база данных пакета будет меняться между поиском ключа и установки пакета. Если это важно для вас, ознакомьтесь с with-pkg-lock

 Смежные вопросы

  • Нет связанных вопросов^_^