Замораживание всех зависимостей при сборке исполняемых файлов с помощью `cabal v2-install`

Я строю образ Docker, в котором я хочу объединить несколько исполняемых файлов. Каждый исполняемый файл определяется в отдельном пакете, в моем случае pandoc, pandoc-citeproc, а также pandoc-crossref, Сборка должна быть максимально воспроизводимой в системе на основе Debian/Ubuntu.

Я хотел бы использовать (что-то вроде) файл cabal.project.freeze, чтобы гарантировать, что все последующие сборки будут использовать одни и те же пакеты.

Я знаю, что могу исправить версию исполняемых файлов:

cabal v2-install pandoc-2.7.3 pandoc-citeproc-0.16.2 pandoc-crossref-0.3.4.1

Но это не исправит версии транзитивных зависимостей, поэтому повторная сборка в разное время может привести к слегка различающимся результатам сборки. Можно ли как-то создать и использовать стоп- файл в этой настройке? Использование v2-freeze здесь бесполезно:

$ cabal new-freeze pandoc-2.7.3 pandoc-citeproc-0.16.2 pandoc-crossref-0.3.4.1
cabal: 'freeze' doesn't take any extra arguments: pandoc-2.7.3
pandoc-citeproc-0.16.2 pandoc-crossref-0.3.4.1

1 ответ

Решение

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

Основной план будет таким: временно создайте проект с тремя интересующими вас пакетами - достаточно долго, чтобы получить файл замораживания - затем используйте несколько простых макросов текстового редактора, чтобы превратить файл замораживания в v2-install команда. Так:

% cabal unpack pandoc-2.7.3 pandoc-citeproc-0.16.2 pandoc-crossref-0.3.4.1
% echo >cabal.project packages: pandoc-2.7.3 pandoc-citeproc-0.16.2 pandoc-crossref-0.3.4.1
% cabal v2-freeze
% sed "s/^constraints: /cabal v2-install pandoc-2.7.3 pandoc-citeproc-0.16.2 pandoc-crossref-0.3.4.1 --constraint '/;s/^ \+/--constraint '/;s/,\$/' \\\\/;\$s/\$/'/" cabal.project.freeze >cabal-v2-install.sh

Гав, этот последний глоток. Это говорит:

# Replace the starting "constraints" stanza with the v2-install command we want to
# run. The first line of the stanza includes a constraint, so prefix it with
# --constraint and start a quote.
s/^constraints: /cabal v2-install pandoc-2.7.3 pandoc-citeproc-0.16.2 pandoc-crossref-0.3.4.1 --constraint '/
# The line we just produced doesn't start with spaces, so this only fires on the
# remaining lines. On those lines, it prefixes --constraint and starts a quote.
s/^ \+/--constraint '/
# Close the quote begun on each line, and replace cabal's line-continuation
# character (,) with a shell's line-continuation character (\). The $ and \ are
# escaped because we are inside the current shell's ""-quoted string.
s/,\$/' \\\\/
# The last line doesn't have a line-continuation character, but still needs its
# quote closed. The two occurrences of $ are escaped because we are inside the
# current shell's ""-quoted string.
\$s/\$/'/

Вы также можете сделать это вручную в редакторе, если хотите. В конце этого процесса, который вы можете запустить во временном каталоге для облегчения очистки, у вас должен быть файл с именем cabal-v2-install.sh с помощью команды, которая выберет одинаковые версии и флаги для всех задействованных пакетов, включая зависимости.

Другие вопросы по тегам