Вышла версия 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++, но ничего не мешает использовать его для проектов на других языках программирования.
Комментариев нет:
Отправить комментарий