3. Управление пакетами
Добавление пакетов
Существует два способа добавления пакетов: с помощью команды add
или команды dev
. Наиболее часто используется add
, и ее применение описывается первым.
Добавление зарегистрированных пакетов
В REPL Pkg пакеты можно добавить с помощью команды add
, за которой следует имя пакета, например:
(@v1.8) pkg> add JSON
Installing known registries into `~/`
Resolving package versions...
Installed Parsers ─ v2.4.0
Installed JSON ──── v0.21.3
Updating `~/.julia/environments/v1.8/Project.toml`
[682c06a0] + JSON v0.21.3
Updating `~/environments/v1.9/Manifest.toml`
[682c06a0] + JSON v0.21.3
[69de0a69] + Parsers v2.4.0
[ade2ca70] + Dates
[a63ad114] + Mmap
[de0858da] + Printf
[4ec0a83e] + Unicode
Precompiling environment...
2 dependencies successfully precompiled in 2 seconds
Здесь мы добавили пакет Example в текущую среду (которая является средой @v1.8
по умолчанию). В этом примере мы используем актуальную установку Julia и в первый раз добавляем пакет с помощью Pkg. По умолчанию Pkg устанавливает реестр General и использует его для поиска пакетов, запрашиваемых для включения в текущую среду. В обновлении статуса слева отображается краткая форма UUID пакета, затем имя пакета и версия. Наконец, установленные пакеты предварительно компилируются.
Можно добавить несколько пакетов одной командой в виде pkg> add A B C
.
В выходных данных состояния приводятся пакеты, которые вы добавили сами, в данном случае JSON
:
(@v1.8) pkg> st
Status `~/.julia/environments/v1.8/Project.toml`
[682c06a0] JSON v0.21.3
В состоянии манифеста отображаются все пакеты в среде, включая рекурсивные зависимости:
(@v1.8) pkg> st -m
Status `~/environments/v1.9/Manifest.toml`
[682c06a0] JSON v0.21.3
[69de0a69] Parsers v2.4.0
[ade2ca70] Dates
[a63ad114] Mmap
[de0858da] Printf
[4ec0a83e] Unicode
Поскольку стандартные библиотеки (например, Dates
) входят в состав Julia, они не имеют версии.
После добавления пакета в проект его можно загрузить в Julia:
julia> using JSON
julia> JSON.json(Dict("foo" => [1, "bar"])) |> print
{"foo":[1,"bar"]}
Могут быть загружены только пакеты, добавленные с помощью |
Для установки конкретной версии пакета можно добавить номер версии после символа @
к имени пакета:
(@v1.8) pkg> add JSON@0.21.1
Resolving package versions...
Updating `~/.julia/environments/v1.8/Project.toml`
⌃ [682c06a0] + JSON v0.21.1
Updating `~/environments/v1.9/Manifest.toml`
⌃ [682c06a0] + JSON v0.21.1
⌅ [69de0a69] + Parsers v1.1.2
[ade2ca70] + Dates
[a63ad114] + Mmap
[de0858da] + Printf
[4ec0a83e] + Unicode
Info Packages marked with ⌃ and ⌅ have new versions available, but those with ⌅ are restricted by compatibility constraints from upgrading. To see why use `status --outdated -m`
Как было показано выше, Pkg выдает некоторую информацию, когда не установлена последняя версия пакета.
Если для версии указаны не все три числа, например 0.21
, будет установлена последняя зарегистрированная версия 0.21.x
.
Если ветвь (или определенная фиксация) пакета Example
содержит исправление, которое еще не включено в зарегистрированную версию, можно явным образом отслеживать эту ветвь (или фиксацию), добавив #branchname
(или #commitSHA1
) к имени пакета:
(@v1.8) pkg> add Example#master
Cloning git-repo `https://github.com/JuliaLang/Example.jl.git`
Resolving package versions...
Updating `~/.julia/environments/v1.8/Project.toml`
[7876af07] + Example v0.5.4 `https://github.com/JuliaLang/Example.jl.git#master`
Updating `~/environments/v1.9/Manifest.toml`
[7876af07] + Example v0.5.4 `https://github.com/JuliaLang/Example.jl.git#master`
Теперь в выходных данных состояния отображается, что мы отслеживаем ветвь master
пакета Example
. При обновлении пакетов обновления извлекаются из этой ветви.
Если бы мы вместо имени ветви указали идентификатор фиксации, например |
Чтобы вернуться к отслеживанию версии реестра Example
, используется команда free
:
(@v1.8) pkg> free Example
Resolving package versions...
Installed Example ─ v0.5.3
Updating `~/.julia/environments/v1.8/Project.toml`
[7876af07] ~ Example v0.5.4 `https://github.com/JuliaLang/Example.jl.git#master` ⇒ v0.5.3
Updating `~/environments/v1.9/Manifest.toml`
[7876af07] ~ Example v0.5.4 `https://github.com/JuliaLang/Example.jl.git#master` ⇒ v0.5.3
Добавление незарегистрированных пакетов
Если пакет отсутствует в реестре, его можно добавить, указав URL-адрес репозитория Git:
(@v1.8) pkg> add https://github.com/fredrikekre/ImportMacros.jl
Cloning git-repo `https://github.com/fredrikekre/ImportMacros.jl`
Resolving package versions...
Updating `~/.julia/environments/v1.8/Project.toml`
[92a963f6] + ImportMacros v1.0.0 `https://github.com/fredrikekre/ImportMacros.jl#master`
Updating `~/environments/v1.9/Manifest.toml`
[92a963f6] + ImportMacros v1.0.0 `https://github.com/fredrikekre/ImportMacros.jl#master`
Зависимости незарегистрированного пакета (здесь MacroTools
) были установлены. Для незарегистрированных пакетов можно указать имя ветви (или SHA1 фиксации) для отслеживания с помощью #
, как и для зарегистрированных пакетов.
Чтобы добавить пакет с помощью протокола git
на основе SSH, придется использовать кавычки, поскольку URL-адрес содержит @
. Например,
(@v1.8) pkg> add "git@github.com:fredrikekre/ImportMacros.jl.git"
Cloning git-repo `git@github.com:fredrikekre/ImportMacros.jl.git`
Updating registry at `~/.julia/registries/General`
Resolving package versions...
Updating `~/.julia/environments/v1/Project.toml`
[92a963f6] + ImportMacros v1.0.0 `git@github.com:fredrikekre/ImportMacros.jl.git#master`
Updating `~/.julia/environments/v1/Manifest.toml`
[92a963f6] + ImportMacros v1.0.0 `git@github.com:fredrikekre/ImportMacros.jl.git#master`
Добавление пакета в подкаталоге репозитория
Если пакет, который вы хотите добавить по URL-адресу, не находится в корне репозитория, вам нужно передать этот подкаталог с помощью :
. Например, чтобы добавить пакет SnoopCompileCore
в репозитории SnoopCompile, выполните следующее:
pkg> add https://github.com/timholy/SnoopCompile.jl.git:SnoopCompileCore
Cloning git-repo `https://github.com/timholy/SnoopCompile.jl.git`
Resolving package versions...
Updating `~/.julia/environments/v1.8/Project.toml`
[e2b509da] + SnoopCompileCore v2.9.0 `https://github.com/timholy/SnoopCompile.jl.git:SnoopCompileCore#master`
Updating `~/.julia/environments/v1.8/Manifest.toml`
[e2b509da] + SnoopCompileCore v2.9.0 `https://github.com/timholy/SnoopCompile.jl.git:SnoopCompileCore#master`
[9e88b42a] + Serialization
Добавление локального пакета
Вместо указания URL-адреса репозитория для добавления (add
) можно указать локальный путь к репозиторию git. Это работает аналогично добавлению URL-адреса. Локальный репозиторий будет отслеживаться (в определенной ветви), и при обновлении пакетов будут извлекаться обновления из этого локального репозитория.
Обратите внимание, что отслеживание пакета с помощью |
Разработка пакетов
При использовании только add
среда всегда находится в «воспроизводимом состоянии». Другими словами, пока используемые репозитории и реестры остаются доступными, можно получить точное состояние всех зависимостей в среде. Преимущество этого способа заключается в том, что вы можете отправить свою среду (Project.toml
и Manifest.toml
) кому-то другому, и он сможет с помощью Pkg.instantiate
создать экземпляр этой среды в том же состоянии, в котором она была у вас локально. Однако при разработке пакета удобнее загружать пакеты в их текущем состоянии по определенному пути. Это можно сделать с помощью команды dev
.
Давайте попробуем разработать (dev
) зарегистрированный пакет:
(@v1.8) pkg> dev Example
Updating git-repo `https://github.com/JuliaLang/Example.jl.git`
Resolving package versions...
Updating `~/.julia/environments/v1.8/Project.toml`
[7876af07] + Example v0.5.4 `~/.julia/dev/Example`
Updating `~/.julia/environments/v1.8/Manifest.toml`
[7876af07] + Example v0.5.4 `~/.julia/dev/Example`
Команда dev
получает полный клон пакета по пути ~/.julia/dev/
(путь можно изменить, задав переменную среды JULIA_PKG_DEVDIR
, по умолчанию используется joinpath(DEPOT_PATH[1],"dev")
). При импорте Example
Julia теперь будет импортировать его из пути ~/.julia/dev/Example
, и все локальные изменения, внесенные в файлы по этому пути, отразятся в загружаемом коде. Когда мы использовали add
, мы говорили, что отслеживаем репозиторий пакетов. Здесь мы говорим, что отслеживаем сам путь. Обратите внимание, что диспетчер пакетов никогда не будет трогать файлы по отслеживаемому пути. Поэтому вы сами должны извлекать обновления, изменять ветви и т. д. Если мы попытаемся разработать (dev
) пакет в какой-то ветви, которая уже существует по пути ~/.julia/dev/
, диспетчер пакетов просто повторно использует существующий путь. Если dev
используется в локальном пути, то этот путь к пакету записывается и используется при загрузке этого пакета. Путь будет записан относительно файла проекта, если только он не указан как абсолютный путь.
Попробуем изменить файл по пути ~/.julia/dev/Example/src/Example.jl
и добавить простую функцию:
plusone(x::Int) = x + 1
Теперь мы можем вернуться в REPL Julia, загрузить пакет и выполнить новую функцию:
julia> import Example
[ Info: Precompiling Example [7876af07-990d-54b4-ab0e-23690620f79a]
julia> Example.plusone(1)
2
Пакет можно загрузить в сеансе Julia только один раз. Если вы уже выполнили |
Чтобы прекратить отслеживание пути и снова применять зарегистрированную версию, используйте free
:
(@v1.8) pkg> free Example
Resolving package versions...
Updating `~/.julia/environments/v1.8/Project.toml`
[7876af07] ~ Example v0.5.4 `~/.julia/dev/Example` ⇒ v0.5.3
Updating `~/.julia/environments/v1.8/Manifest.toml`
[7876af07] ~ Example v0.5.4 `~/.julia/dev/Example` ⇒ v0.5.3
Следует отметить, что при использовании dev
проект становится проектом с отслеживанием состояния. Его состояние зависит от текущего содержимого файлов по пути, и экземпляр манифеста не может быть создан кем-то другим, кто не знает точного содержимого всех пакетов, отслеживающих путь.
Обратите внимание, что если вы добавите зависимость в пакет, который отслеживает локальный путь, то манифест (который содержит весь граф зависимостей) будет рассинхронизирован с реальным графом зависимостей. Это означает, что пакет не сможет загрузить эту зависимость, поскольку она не записана в манифесте. Чтобы синхронизировать манифест, используйте команду REPL resolve
.
Помимо абсолютных путей, add
и dev
могут принимать относительные пути к пакетам. В этом случае сохраняется относительный путь от активного проекта к пакету. Этот подход полезен, когда относительное расположение отслеживаемых зависимостей важнее, чем их абсолютное расположение. Например, отслеживаемые зависимости могут храниться в каталоге активного проекта. Можно переместить весь каталог, и Pkg
все равно сможет найти зависимости, потому что их путь относительно активного проекта сохраняется, даже если их абсолютный путь изменился.
Удаление пакетов
Удалить пакеты из текущего проекта можно с помощью команды pkg> rm Package
. При этом будут удалены только те пакеты, которые существуют в проекте. Чтобы удалить пакет, который существует только как зависимость, используйте pkg> rm --manifest DepPackage
. Обратите внимание, что в этом случае будут удалены все пакеты, которые (рекурсивно) зависят от DepPackage
.
Обновление пакетов
Рекомендуется обновлять выходящие новые версии пакетов. Просто вызовите up
, чтобы попытаться обновить все зависимости проекта до последней совместимой версии. Иногда это совсем не то, что вам нужно. Вы можете указать подмножество зависимостей для обновления, передав их в качестве аргументов в up
, например:
(@v1.8) pkg> up Example
Так можно обновить только пакет Example. Если вы также хотите разрешить обновление зависимостей Example (за исключением пакетов, которые находятся в проекте), можно передать флаг --preserve=direct
.
(@v1.8) pkg> up --preserve=direct Example
А если вы также хотите разрешить обновление зависимостей Example, которые находятся в проекте, используйте --preserve=none
.
(@v1.8) pkg> up --preserve=none Example
Закрепление пакета
Закрепленный пакет никогда не обновляется. Пакет можно закрепить с помощью pin
, например:
(@v1.8) pkg> pin Example
Resolving package versions...
Updating `~/.julia/environments/v1.8/Project.toml`
[7876af07] ~ Example v0.5.3 ⇒ v0.5.3 ⚲
Updating `~/.julia/environments/v1.8/Manifest.toml`
[7876af07] ~ Example v0.5.3 ⇒ v0.5.3 ⚲
Обратите внимание на символ канцелярской кнопки ⚲
, показывающий, что пакет закреплен. Удаление закрепления выполняется с помощью команды free
(@v1.8) pkg> free Example
Updating `~/.julia/environments/v1.8/Project.toml`
[7876af07] ~ Example v0.5.3 ⚲ ⇒ v0.5.3
Updating `~/.julia/environments/v1.8/Manifest.toml`
[7876af07] ~ Example v0.5.3 ⚲ ⇒ v0.5.3
Сборка пакетов
Шаг сборки пакета автоматически запускается при первой установке пакета. Выходные данные процесса сборки направляются в файл. Для запуска шага сборки пакета явным образом используется команда build
:
(@v1.8) pkg> build IJulia
Building Conda ─→ `~/.julia/scratchspaces/44cfe95a-1eb2-52ea-b672-e2afdf69b78f/6e47d11ea2776bc5627421d59cdcc1296c058071/build.log`
Building IJulia → `~/.julia/scratchspaces/44cfe95a-1eb2-52ea-b672-e2afdf69b78f/98ab633acb0fe071b671f6c1785c46cd70bb86bd/build.log`
julia> print(read(joinpath(homedir(), ".julia/scratchspaces/44cfe95a-1eb2-52ea-b672-e2afdf69b78f/98ab633acb0fe071b671f6c1785c46cd70bb86bd/build.log"), String))
[ Info: Installing Julia kernelspec in /home/kc/.local/share/jupyter/kernels/julia-1.8
Интерпретация и разрешение конфликтов версий
Среда состоит из набора взаимно совместимых пакетов. Иногда может возникнуть ситуация, когда два пакета, которые вы хотели бы использовать одновременно, имеют несовместимые требования. В таких случаях возникает ошибка «Невыполнимые требования»:
pkg> add A Unsatisfiable requirements detected for package D [756980fe]: D [756980fe] log: ├─possible versions are: 0.1.0-0.2.1 or uninstalled ├─restricted by compatibility requirements with B [f4259836] to versions: 0.1.0 │ └─B [f4259836] log: │ ├─possible versions are: 1.0.0 or uninstalled │ └─restricted to versions * by an explicit requirement, leaving only versions: 1.0.0 └─restricted by compatibility requirements with C [c99a7cb2] to versions: 0.2.0 — no versions left └─C [c99a7cb2] log: ├─possible versions are: 0.1.0-0.2.0 or uninstalled └─restricted by compatibility requirements with A [29c70717] to versions: 0.2.0 └─A [29c70717] log: ├─possible versions are: 1.0.0 or uninstalled └─restricted to versions * by an explicit requirement, leaving only versions: 1.0.0
Это сообщение означает, что в пакете с именем D
присутствует конфликт версий. Даже если вы никогда не добавляли (add
) D
напрямую, такая ошибка может возникнуть, если пакет D
требуется другим пакетам, которые вы пытаетесь использовать.
При устранении этих конфликтов сначала подумайте о том, что чем крупнее проект, тем больше вероятность возникновения конфликта. Настоятельно рекомендуется использовать целевые проекты для конкретной задачи, а удаление неиспользуемых зависимостей является хорошим первым шагом при возникновении подобных проблем. Например, распространенной ошибкой является наличие немалого количества пакетов в среде по умолчанию (т. е. |
Сообщение об ошибке содержит много важной информации. Возможно, проще всего выполнять интерпретацию по частям:
Unsatisfiable requirements detected for package D [756980fe]: D [756980fe] log: ├─possible versions are: [0.1.0, 0.2.0-0.2.1] or uninstalled
означает, что пакет D
имеет три выпущенные версии — v0.1.0
, v0.2.0
и v0.2.1
. Вы также можете не устанавливать его вообще. Каждый из этих вариантов может иметь различные последствия для набора других пакетов, которые могут быть установлены.
Важно обратить внимание на штриховые символы (вертикальные и горизонтальные линии) и их отступы. Вместе они соединяют сообщения с конкретными пакетами. Например, правый штрих ├─
указывает на то, что сообщение справа от него (possible versions...
) связано с пакетом, на который указывает его вертикальный штрих (D
). Этот же принцип применим и к следующей строке:
├─restricted by compatibility requirements with B [f4259836] to versions: 0.1.0
Вертикальный штрих здесь также выровнен с D
, и, таким образом, это сообщение относится к пакету D
. В частности, существует другой пакет B
, который зависит от версии v0.1.0
пакета D
. Обратите внимание, что это не самая новая версия пакета D
.
Далее следует информация о пакете B
:
│ └─B [f4259836] log: │ ├─possible versions are: 1.0.0 or uninstalled │ └─restricted to versions * by an explicit requirement, leaving only versions 1.0.0
Две строки под первой имеют вертикальный штрих, который выравнивается с B
, и, таким образом, они предоставляют информацию о пакете B
. Они сообщают, что пакет B
имеет только один выпуск v1.0.0
. Вы не указали конкретную версию пакета B
(restricted to versions *
означает, что подойдет любая версия), но explicit requirement
означает, что вы попросили, чтобы пакет B
стал частью вашей среды, например с помощью pkg> add B
. Возможно, вы уже запрашивали пакет B
ранее, и это требование все еще активно.
Конфликт становится понятным благодаря следующей строке:
└─restricted by compatibility requirements with C [c99a7cb2] to versions: 0.2.0 — no versions left
Здесь снова вертикальный штрих выравнивается с пакетом D
: это означает, что пакет D
требуется также для другого пакета, C
. Для пакета C
требуется версия v0.2.0
пакета D
, и это конфликтует с потребностью пакета B
в версии v0.1.0
пакета D
. Это и объясняет конфликт.
Но подождите, спросите вы, что такое пакет C
и зачем он вообще нужен? Проблема представлена в следующих нескольких строках:
└─C [c99a7cb2] log: ├─possible versions are: [0.1.0-0.1.1, 0.2.0] or uninstalled └─restricted by compatibility requirements with A [29c70717] to versions: 0.2.0
Они содержат дополнительную информацию о пакете C
, показывая, что у него есть 3 выпущенные версии: v0.1.0
, v0.1.1
и v0.2.0
. Кроме того, C
требуется другому пакету A
. Действительно, требования пакета A
таковы, что нам требуется версия v0.2.0
пакета C
. Источник пакета A
раскрывается в следующих строках:
└─A [29c70717] log: ├─possible versions are: 1.0.0 or uninstalled └─restricted to versions * by an explicit requirement, leaving only versions 1.0.0
Итак, мы видим, что пакет A
требовался явным образом, и в данном случае это связано с тем, что мы пытались добавить (add
) его в среду.
В итоге мы явным образом хотели использовать пакеты A
и B
, но это привело к конфликту для пакета D
. Причина заключалась в том, что для пакетов B
и C
требуются конфликтующие версии пакета D
. Хотя пакет C
не является тем, что нам было нужно явным образом, он был необходим для пакета A
.
Существует несколько вариантов исправления таких ошибок:
-
Попытайтесь обновить пакеты. Возможно, разработчики этих пакетов недавно выпустили новые версии, которые взаимно совместимы.
-
Удалите пакет
A
илиB
из среды. Возможно, пакетB
остался от вашего предыдущего проекта, и он вам больше не требуется. Если вам не нужны пакетыA
иB
одновременно, это самый простой способ решить проблему. -
Попробуйте сообщить о конфликте. В этом случае мы смогли сделать вывод, что для пакета
B
требуется устаревшая версия пакетаD
. Таким образом, вы можете сообщить о проблеме в репозитории разработкиB.jl
и попросить обновленную версию. -
Попробуйте решить проблему самостоятельно. Решение станет проще, как только вы поймете, что такое файлы
Project.toml
и как они заявляют о своих требованиях к совместимости. Мы вернемся к этому примеру в разделе Устранение конфликтов.
Сборка старых и неиспользуемых пакетов в мусор
По мере обновления пакетов и удаления проектов установленные версии пакетов и артефакты, которые когда-то использовались, неизбежно устаревают и не используются ни в одном из существующих проектов. Pkg
ведет журнал всех использовавшихся проектов, поэтому он может просмотреть журнал и определить, какие проекты еще существуют и какие пакеты или артефакты использовались в этих проектах. Если пакет или артефакт не помечен как используемый в каком-либо проекте, он добавляется в список ненужных. Пакеты и артефакты, находящиеся в списке ненужных в течение 30 дней без повторного использования, удаляются из системы при следующей сборке мусора. Этот временной режим настраивается с помощью именованного аргумента collect_delay
для Pkg.gc()
. Если задано значение 0
, все, что в данный момент не используется, будет немедленно собрано, а список ненужных пакетов и артефактов будет полностью пропущен. Если у вас мало места на диске и вы хотите удалить как можно больше неиспользуемых пакетов и артефактов, вы можете попробовать сделать это, но если эти версии понадобятся снова, вам придется загрузить их повторно. Чтобы запустить стандартную сборку мусора с аргументами по умолчанию, просто используйте команду gc
в REPL pkg>
:
(@v1.8) pkg> gc
Active manifests at:
`~/BinaryProvider/Manifest.toml`
...
`~/Compat.jl/Manifest.toml`
Active artifacts:
`~/src/MyProject/Artifacts.toml`
Deleted ~/.julia/packages/BenchmarkTools/1cAj: 146.302 KiB
Deleted ~/.julia/packages/Cassette/BXVB: 795.557 KiB
...
Deleted `~/.julia/artifacts/e44cdf2579a92ad5cbacd1cddb7414c8b9d2e24e` (152.253 KiB)
Deleted `~/.julia/artifacts/f2df5266567842bbb8a06acca56bcabf813cd73f` (21.536 MiB)
Deleted 36 package installations (113.205 MiB)
Deleted 15 artifact installations (20.759 GiB)
Обратите внимание, что удаляются только пакеты из каталога ~/.julia/packages
.
Автономный режим
В автономном режиме Pkg пытается выполнить как можно больше задач без подключения к Интернету. Например, при добавлении пакета Pkg учитывает только те версии, которые уже скачаны в разрешении версий.
Для работы в автономном режиме используйте import Pkg; Pkg.offline(true)
или задайте переменной среды JULIA_PKG_OFFLINE
значение "true"
.
Клиент/сервер Pkg
При добавлении нового зарегистрированного пакета обычно происходят три вещи:
-
Обновление реестров.
-
Скачивание исходного кода пакета.
-
Если он недоступен, скачивание артефактов, необходимых пакету.
Реестр General и большинство содержащихся в нем пакетов разрабатываются на сайте GitHub, а данные артефактов размещаются на различных платформах. Если сетевое подключение к GitHub и AWS S3 нестабильно, устанавливать или обновлять пакеты обычно не рекомендуется. Но возможность использования клиента/сервера в Pkg улучшает работу в том смысле, что:
-
если функция задана, клиент Pkg сначала попытается скачать данные с сервера Pkg,
-
в случае неудачи продолжается скачивание из исходных источников (например, с сайта GitHub).
По умолчанию клиент выполняет до 8
одновременных запросов к серверу. Это значение можно задать с помощью переменной среды JULIA_PKG_CONCURRENT_DOWNLOADS
.
Начиная с Julia 1.5 https://pkg.julialang.org
, предоставляемый организацией JuliaLang, используется в качестве сервера Pkg по умолчанию. В большинстве случаев работа должна быть прозрачной, но пользователи по-прежнему могут задавать или отменять вышестоящий сервер Pkg с помощью переменной среды JULIA_PKG_SERVER
.
# вручную зададим какой-нибудь сервер pkg
julia> ENV["JULIA_PKG_SERVER"] = "pkg.julialang.org"
"pkg.julialang.org"
# отменим установку, чтобы всегда скачивать данные из первоисточников
julia> ENV["JULIA_PKG_SERVER"] = ""
""
Поясним, что сервер Pkg не предоставляет некоторые источники:
-
пакеты/регистры, полученные с помощью
git
-
]add https://github.com/JuliaLang/Example.jl.git
-
]add Example#v0.5.3
(обратите внимание, что это отличается от]add Example@0.5.3
) -
]registry add https://github.com/JuliaRegistries/General.git
, включая реестры, установленные в Julia версии, предшествующей 1.4.
-
-
артефакты без информации о скачивании
Если вы установили новый реестр с помощью сервера Pkg, старые версии Julia не смогут обновить реестр, потому что Julia версии, предшествующей 1.4, не знает, как получить новые данные. Следовательно, пользователям, которые часто переключаются между несколькими версиями Julia, рекомендуется по-прежнему использовать реестры, управляемые git. |
Сведения о развертывании сервера Pkg см. в разделе о PkgServer.jl.