среда, 27 апреля 2016 г.

[prog] Не могу не поделиться удовольствием от использования MxxRu::externals

Совсем маленький свежий пример. Было небольшое описание внешних зависимостей для тестового проектика:

MxxRu::svn_externals :so5 do |e|
  e.url 'http://svn.code.sf.net/p/sobjectizer/repo/tags/so_5/5.5.16'
  e.option '-q'
  e.option '--native-eol''LF'

  e.map_dir 'dev/so_5' => 'dev'
end

MxxRu::svn_externals :timertt do |e|
  e.url 'http://svn.code.sf.net/p/sobjectizer/repo/tags/timertt/1.1.1'
  e.option '-q'
  e.option '--native-eol''LF'

  e.map_dir 'dev/timertt' => 'dev'
end

MxxRu::arch_externals :boost_process do |e|
  e.url 'http://www.highscore.de/boost/process0.5/process.zip'

  e.map_dir 'boost' => 'dev'
end

MxxRu::hg_externals :boost_process_mxxru do |e|
  e.url 'https://bitbucket.org/sobjectizerteam/boost_process_mxxru-0.1'
  e.map_dir 'dev/boost_process_mxxru' => 'dev'
end

Понадобилось добавить в проект еще одну зависимость -- библиотеку procxx. Эта малюсенькая header-only библиотека, которая живет на GitHub-е, имеет только одну ветку master и не имеет на данный момент ни одного релиза. Добавляю всего несколько строк в externals.rb и получаю зависимость от конкретного коммита в репозитории procxx (что позволяет не боятся сюрпризов, если в последующих коммитах появятся какие-нибудь ломающие совместимость изменения):

MxxRu::git_externals :procxx do |e|
  e.url 'https://github.com/skystrife/procxx'
  e.commit 'dfd9818'
  e.map_file 'include/process.h' => 'dev/procxx/*'
end

Запускаю mxxruexternals...

[Info] Generation of auxilary rakefile: ./mxxruexternals-temp20160427-808-1oixni7
[Info] Launching rake with: rake -f ./mxxruexternals-temp20160427-808-1oixni7 install
[Note] Externals description changed from the last time
[Note] Contents of .externals/previous.rb will be used
[Note] so5 previous rules found
[Note] so5 previous rules the same with current
[Note] timertt previous rules found
[Note] timertt previous rules the same with current
[Note] boost_process previous rules found
[Note] boost_process previous rules the same with current
[Note] boost_process_mxxru previous rules found
[Note] boost_process_mxxru previous rules the same with current
mv .externals/previous.rb .externals/previous.rb.1.bak
git clone https://github.com/skystrife/procxx .externals/procxx.810.18821860
Cloning into '.externals/procxx.810.18821860'...
remote: Counting objects: 129, done.
remote: Total 129 (delta 0), reused 0 (delta 0), pack-reused 129
Receiving objects: 100% (129/129), 22.34 KiB | 0 bytes/s, done.
Resolving deltas: 100% (59/59), done.
Checking connectivity... done.
cd .externals/procxx.810.18821860
git checkout dfd9818
Note: checking out 'dfd9818'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at dfd9818... Merge pull request #9 from Florianjw/master
cd -
mv .externals/procxx.810.18821860 .externals/procxx
mkdir -p dev/procxx
cp .externals/procxx/include/process.h dev/procxx/process.h
cp externals.rb .externals/previous.rb

Вот, собственно и все. Получаю у себя в dev нужную мне структуру каталогов с нужным мне содержимым:

dev
├── boost
│   └── process
│       ├── posix
│       │   └── initializers
│       └── windows
│           └── initializers
├── boost_process_mxxru
├── procxx
├── so_5
│   ├── api
...
├── t1
├── target
│   └── gcc_5_2_1__x86_64_linux_gnu
│       └── release
│           └── ticker
├── ticker
└── timertt

Лепота! ;)

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

Upd. Чуть позже довелось заменить оригинальную версию procxx на форкнутую и пропатченную мной. Нет ничего проще! Сначала меняю описание зависимости в externals.rb:

MxxRu::git_externals :procxx do |e|
  e.url 'https://github.com/eao197/procxx'
  e.commit 'bf1284c'
  e.map_file 'include/process.h' => 'dev/procxx/*'
end

Запускаю mxxruexternals и вуаля:

[Info] Generation of auxilary rakefile: ./mxxruexternals-temp20160427-1908-zb1fhd
[Info] Launching rake with: rake -f ./mxxruexternals-temp20160427-1908-zb1fhd install
[Note] Externals description changed from the last time
[Note] Contents of .externals/previous.rb will be used
[Note] so5 previous rules found
[Note] so5 previous rules the same with current
[Note] timertt previous rules found
[Note] timertt previous rules the same with current
[Note] boost_process previous rules found
[Note] boost_process previous rules the same with current
[Note] boost_process_mxxru previous rules found
[Note] boost_process_mxxru previous rules the same with current
[Note] procxx previous rules found
[Note] procxx previous rules differ with current
[Note] procxx WILL BE REGET
rm dev/procxx/process.h
rm -r .externals/procxx
mv .externals/previous.rb.1.bak .externals/previous.rb.2.bak
mv .externals/previous.rb .externals/previous.rb.1.bak
git clone https://github.com/eao197/procxx .externals/procxx.1910.5706480
Cloning into '.externals/procxx.1910.5706480'...
remote: Counting objects: 133, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 133 (delta 0), reused 0 (delta 0), pack-reused 129
Receiving objects: 100% (133/133), 27.92 KiB | 0 bytes/s, done.
Resolving deltas: 100% (59/59), done.
Checking connectivity... done.
cd .externals/procxx.1910.5706480
git checkout bf1284c
Note: checking out 'bf1284c'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at bf1284c... More advanced version of process::running
cd -
mv .externals/procxx.1910.5706480 .externals/procxx
cp .externals/procxx/include/process.h dev/procxx/process.h
cp externals.rb .externals/previous.rb

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