среда, 9 марта 2016 г.

[prog] Mxx_ru 1.6.8

Вышла версия 1.6.8 инструмента Mxx_ru с первой полной реализацией т.н. externals. Теперь внешние проекты можно забирать из репозиториев Git, Hg, Subversion, а так же в виде tar, zip и 7z архивов.

Установить Mxx_ru можно командой gem install Mxx_ru

Обновить Mxx_ru можно командой gem update Mxx_ru

Так же Mxx_ru можно загрузить с SourceForge (gem-файл).

PDF-ку с документацией буду обновлять. Если все пойдет нормально, то надеюсь выложить ее в начале следующей недели. Пока же информацию о возможностях версии 1.6.8 можно найти в блоге и G+ (запись номер раз, запись номер два, запись номер три, плюс дополнительная информация под катом).

Итак, внешние проекты можно брать из репозиториев Git, Hg и Svn. Описания внешних зависимостей в этих случаях делаются разными функциями: MxxRu::git_externals, MxxRu::hg_externals и Mxx_Ru::svn_externals соответственно. Внутри этих функций много общего (например, общие свойства url, option, map/map_dir и map_file), но есть и уникальные опции для каждого типа репозитория:

  • для git_externals поддерживаются опции:
    • tag и commit. Это взаимоисключающие опции. Если указана опция tag, то при клонировании git-репозитория формируется командная строка вида:

      git clone --branch TAG_VALUE URL

      Где TAG_VALUE -- это значение опции tag, а URL -- это значение опции url. После чего результат клонирования забирается в соответствии с опциями map_dir и map_file без каких-либо дополнительных действий.

      В случае, если указана опция commit, то для получения исходников из git-репозитория выполняются два действия:

      git clone URL
      git checkout COMMIT

      Где COMMIT -- это значение опции commit.

    • unlimited_depth. Эта опция учитывается только если не задана опция commit.

      По умолчанию инициируется git clone --depth 1 URL чтобы уменьшить объем загружаемой информации. Опция unlimited_depth запрещает использование параметра --depth 1 при вызове git clone.

    • recursive. Эта опция учитывается только если не задана опция commit.

      Опция recursive добавляет параметр --recursive в команду git clone. Что может использоваться в случае, если в git-репозитории используются submodules.

  • для hg_externals поддерживается опция:
    • tag. Если опция tag указана, то при клонировании hg-репозитория формируется командная строка вида:

      hg clone --updaterev TAG_VALUE URL

      Где TAG_VALUE -- это значение опции tag. Т.о. опция tag может указывать имя тега, имя ветки или ревизию.

  • для svn_externals поддерживаются опции:
    • rev. Задает номер ревизии, который будет использован при взятии исходных текстов из репозитория. Если опция rev задана, то формируется командная строка вида:

      svn export -rREV URL

      Где REV -- это значение опции rev. Соответственно, rev может содержать любое значение, разрешенное в качестве идентификатора ревизии в Subversion.

    • with_externals. Эта опция запрещает использование параметра --ignore-externals при выполнении команды svn export.

      По умолчанию, если with_externals не указана, формируется командная строка вида:

      svn export --ignore-externals URL

      что запрещает Subversion при экспорте обрабатывать свойства svn:externals. Если такое поведение нежелательно и требуется, чтобы при svn export Subversion должным образом обрабатывал svn:externals, то требуется использовать опцию with_externals.

Git, Hg и Svn-зависимости обрабатываются посредством соответствующих программ. Т.е., если указывается svn_externals, то для обработки Svn-зависимостей будет запускаться команда svn. Соответственно, Svn должен быть установлен и доступен через PATH.

Поскольку все Git/Hg/Svn зависимости обрабатываются через "родные" инструменты, то в URL поддерживаются все схемы, которые доступны для Git/Hg/Svn (например, http, file, ssh+svn и т.д.).

Если для команд git/hg clone и svn export нужно задать дополнительные параметры командной строки, то делается это посредством option:

MxxRu::git_externals :asio do |ext|
   ext.url 'https://github.com/chriskohlhoff/asio.git' 
   ext.tag 'asio-1-11-0'
   ext.option '-q'
   ext.map 'asio' => 'dev'
end

MxxRu::svn_externals :so_5 do |ext|
   ext.url = 'http://svn.code.sf.net/p/sobjectizer/repo/tags/so_5/5.5.15.2' 
   ext.option '-q'
   ext.option '--native-eol''LF'
   ext.with_externals
   ext.map "dev/so_5" => 'dev'
   ext.map "dev/test/so_5" => 'dev/test'
end

Зависимости в виде архивов описываются одним и тем же методом arch_externals:

gem 'Mxx_ru''>= 1.6.8'
require 'mxx_ru/externals'

MxxRu::arch_externals :asio do |e|
  e.url 'https://github.com/chriskohlhoff/asio/archive/asio-1-11-0.tar.gz' 
  e.sha1 '1be2489015a1e1c7b8666a5a803d984cdec4a12b'

  e.map_dir 'asio/include' => 'sources/asio'
  e.map_file 'asio/src/asio.cpp' => 'sources/asio/src/asio.cpp'
  e.map_file 'asio/src/asio_ssl.cpp' => 'sources/asio/src/asio_ssl.cpp'
end

MxxRu::arch_externals :eigen do |e|
  e.url 'https://bitbucket.org/eigen/eigen/get/3.2.5.tar.bz2'
  e.sha1 'aa4667f0b134f5688c5dff5f03335d9a19aa9b3d' 

  e.map 'Eigen' => 'sources'
end

MxxRu::arch_externals :so_5 do |e|
  e.url 'https://sourceforge.net/projects/sobjectizer/files/sobjectizer/SObjectizer%20Core%20v.5.5/so-5.5.15.2.zip'
  e.sha1 'd2a4c5e262d8b8ff023f18d93bd742d0b0da4aa1'
 
  e.map 'dev/so_5' => 'sources'

  e.unpacker_option '-q'
end

Тип архива распознается автоматически, посредством анализа последнего имени в URL. Если тип архива распознать не удалось, обработка внешних зависимостей прерывается.

В версии 1.6.8 поддерживаются архивы tar, zip и 7z. Для tar-архивов распознаются следующие расширения: '.tar', '.tar.gz', '.tgz', '.taz', '.tar.Z', '.taZ', '.tar.bz2', '.tz2', '.tbz2', '.tar.lz', '.tar.lzma', '.tlz', '.tar.lzo' и '.tar.xz'. Для zip-архивов только '.zip' и для 7z-архивов только '.7z'.

Соответственно, при распаковке архива запускается либо tar, либо unzip, либо 7z.

Если в url для архива задана схема file (например, url имеет вид file:///d:/externals/archives/asio-1-11-0.tar.bz2), то архив будет просто скопирован во вспомогательный каталог для последующей распаковки. Если же задана какая-то другая схема (например, http или https), то для загрузки будут использоваться утилиты curl или wget (в зависимости от того, что именно будет найдено посредством пробных запусков curl --version и wget --version). В принципе, кроме http/https должна поддерживаться и схема ftp (но эта схема тестами не проверялась).

Если для загрузки архива с внешним проектом нужно задействовать дополнительные параметры для curl/wget, то они задаются через downloader_option (первым параметром при вызове downloader_option должно быть значение :curl или :wget). Если нужно задать какие-то дополнительные параметры распаковщику архива, то они задаются через unpacker_option:

MxxRu::arch_externals :asio do |e|
   e.url 'https://github.com/chriskohlhoff/asio/archive/asio-1-11-0.tar.gz' 
   e.sha1 '1be2489015a1e1c7b8666a5a803d984cdec4a12b'

   e.map 'asio/include/asio' => 'asio'

   e.downloader_option :wget'--no-use-server-timestamps'
   e.downloader_option :wget'-T''36'

   e.unpacker_option '--verbose'
   e.unpacker_option '--no-overwrite-dir'
end

В версии 1.6.8 есть особенность: все параметры для внешних инструментов (т.е. параметры, задаваемые посредством option, downloader_option, unpacker_option) должны быть строковыми значениями. Т.е. нужно писать:

e.downloader_option :wget, '-T', '36'

Если задать значение 36 без кавычек, т.к. обычным числом, то во время обработки внешних зависимостей выскочит исключение о невозможности использовать Fixnum там, где ожидается String. Вот такая пока бяка. Может дойдут руки это исправить.

В общем, минимальный набор функциональности для первой версии MxxRu::externals реализован. Можно пробовать, сообщать об ошибках, предлагать улучшения и т.д. Сам я еще в реальном проекте MxxRu::externals не успел попробовать, но очень похоже, что в ближайшие пару-тройку недель это использование не только случится, но и может оказаться достаточно активным. Так что будем посмотреть, как пойдет.

Так же напомню, что использование MxxRu::externals для работы с исходниками внешних проектов вовсе не требует, чтобы MxxRu затем управлял компиляцией и сборкой. Более того, MxxRu::externals вообще не привязан к типам проектов: так, я собираюсь применять MxxRu::externals для C++, но ничего не мешает использовать его для проектов на других языках программирования.

Комментариев нет: