За все время опыта веб-разработки приходилось сталкиваться с различными хостингами на которых работали сайты: от тех, на которых поддерживаются только текстовые форматы (а-ля narod.ru) до виртуальных машин, на которых есть root доступ.
Относительно недавно столкнулся с проблемой: велась разработка сайта на shared
Задача была выполнена, и как она была решена — пошагово описано ниже.
1. Доступ к shared
$ ssh user@host
2. Зайти в домашнюю директорию. Все действия будут выполнятся относительно неё:
$ cd ~
2. Проверяем, что на shared
$ python --version
Python 2.6.6
$
4. Создаем директорию python, для того чтобы там разместить модули, которые потребуются для работы mercurial, но которых нет на shared
$ mkdir -p python
5. Скачать исходный код Mercurial:
$ wget https://www.mercurial-scm.org/release/mercurial-3.7.tar.gz
6. Извлечь содержимое архива в текущую директорию:
$ tar xvf mercurial-3.7.tar.gz
7. Переименовываем папку в mercurial:
$ mv mercurial-3.7 mercurial -v
8. Перейти в папку mercurial:
$ cd mercurial
9. Устанавливаем mercurial из исходных кодов:
$ python setup.py --pure build_py -c -d . build_ext -i build_mo --force
10. Так как установка из исходных кодов считается нестандартной то необходимо проделать следующее для установки модулей:
$ python setup.py --pure install --prefix ../../python --force
11. Если установка прошла корректно, то в директории ~/python/lib{type}/python{version}/site-packages/ будет следующий список файлов:
$ ls -l ~/python/lib64/python3.7/site-packages/
total 12
drwxr-xr-x 5 user group 4096 Oct 2 2014 hgext
drwxr-xr-x 6 user group 4096 Oct 2 2014 mercurial
-rw-r--r-- 1 user group 238 Oct 2 2014 mercurial-3.7-py3.7.egg-info
$
А в директории ~/python/bin/ будет содержатся скомпилированный hg:
$ ls ~/python/bin/ -l
total 4
-rwxr-xr-x 1 user group 770 Oct 1 2014 hg
$
12. Создаем файл .profile или .bash_profile (зависит от настроек shared-хостинга), если такового нет:
$ touch ~/.profile
13. В файл записываем следующее:
export PATH=~/python/bin:$PATH
export PYTHONPATH=~/python/lib64/python3.7/site-packages
Первая строка добавляет в переменную окружения PATH путь к папке с Mercurial. Вторая строка добавляет путь к модулям python. Добавление этих строк позволяет работать с Mercurial в интерактивном режиме.
14. Для проверки, что все сделано корректно необходимо создать новое подключение ssh и проверить работоспособность Mercurial:
$ hg --version
Если все сделано верно, то будет показано сообщение вида:
Mercurial Distributed SCM (version 3.7)
Copyright (C) 2005-2016 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15. Для работы Mercurial в не интерактивном режиме необходимо добавить файл .bashrc:
export PATH=~/python/bin:$PATH
export PYTHONPATH=~/python/lib64/python3.7/site-packages
После сохранения изменений необходимо попробовать выполнить команду в не интерактивном режиме:
$ ssh user@host hg --version
Если будет показано сообщение вида:
Mercurial Distributed SCM (version 3.7)
Copyright (C) 2005-2016 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
, то настройка завершена.
Если будет сообщение вида:
sh: hg: command not found
Это говорит о том, что shared-хостинг не позволяет пользователю переопределять .bashrc.
Можно передать нужные переменные окружения непосредственно при выполнении команды в не интерактивном режиме:
$ssh user@host "export PATH=~/python/bin:$PATH;declare -x PYTHONPATH=~/python/lib64/python3.7/site-packages;hg --version"
Должно быть показано сообщение вида:
Mercurial Distributed SCM (version 3.7)
Copyright (C) 2005-2016 Matt Mackall <mpm@selenic.com> and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
При работе с удаленным репозиторием размещенном на shared-хостинге наличие переменных окружения требуется для команд выполняющих подключение к удаленному репозиторию:
- clone
- outgoing
- incoming
- pull
- push
Для подключения необходимых переменных окружения необходимо воспользоваться опцией --config, добавив путь к hg:
$ hg --config ui.remotecmd='export "PATH=~/python/bin:$PATH";export "PYTHONPATH=~/python/lib64/python3.7/site-packages";~/python/bin/hg' inc
Либо указать эту настройку в .hg/hgrc в секции [ui]:
[ui]
config ui.remotecmd = export "PATH=~/python/bin:$PATH";export "PYTHONPATH=~/python/lib64/python3.7/site-packages";~/python/bin/hg
При таких настройках удаленная команда может не выполнится, из-за наличия кавычек.
В этом случаем можно создать алиас в .bash_profile на машине, подключающейся к shared-хостингу, для команды hg с этим параметром:
alias hg="hg --config ui.remotecmd='export "PATH=~/python/bin:$PATH";export "PYTHONPATH=~/python/lib64/python2.6/site-packages";~/python/bin/hg'"
После этого можно выполнять команды в привычном виде:
$ hg inc
Ссылки на использованные материалы:
- Installing Mercurial on a Shared Web Server without Root Access
- Installing Python Modules
- Python Windows Install (Описание для Windows, но Windows тут не использовался)
- Mercurial — CommonProblems
- Configuration files for Mercurial
- Linux man page — bash
Автор: gebvlad