Замораживание всех зависимостей при сборке исполняемых файлов с помощью `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
с помощью команды, которая выберет одинаковые версии и флаги для всех задействованных пакетов, включая зависимости.