Данная лабораторная работа посвещена изучению систем управления пакетами на примере Hunter
$ open https://github.com/ruslo/hunter
- 1. Создать новую ветку в репозитории Labs с названием lab10 на сервисе GitHub
- 2. Сгенирировать токен для доступа к сервису GitHub с правами repo
- 3. Выполнить инструкцию учебного материала
- 4. Ознакомиться со ссылками учебного материала
- 5. Составить отчет и отправить ссылку личным сообщением в Slack
Устанавливаем переменные окружения
$ export GITHUB_USERNAME=<имя_пользователя>
$ export GITHUB_TOKEN=<сгенирированный_токен>
Используем ранее созданный скрипт и устанавливаем командную утилиту hub
$ cd ${GITHUB_USERNAME}/workspace
$ pushd .
$ source scripts/activate
$ go get github.com/github/hub
Создаем файл конфигураций для утилиты hub
$ mkdir ~/.config
$ cat > ~/.config/hub <<EOF
github.com:
- user: ${GITHUB_USERNAME}
oauth_token: ${GITHUB_TOKEN}
protocol: https
EOF
$ git config --global hub.protocol https
Скачмваем архив проекта и получаем хэш-сумму архивного файла
$ wget https://github.com/${GITHUB_USERNAME}/Labs/archive/v0.1.0.0.tar.gz
$ export PRINT_SHA1=`openssl sha1 v0.1.0.0.tar.gz | cut -d'=' -f2 | cut -c2-41`
$ echo $PRINT_SHA1 # вывод хэш суммы архива
${PRINT_SHA1}
$ rm -rf v0.1.0.0.tar.gz
Скачиваем репозиторий Hunter и переходим к версии v0.19.137
$ git clone https://github.com/ruslo/hunter projects/hunter
$ cd projects/hunter && git checkout v0.19.137
Примечание: переход на «v0.19.137».
Вы сейчас в состоянии «отделённого HEAD». Вы можете осмотреться, сделать
экспериментальные изменения и закоммитить их, также вы можете отменить
изменения любых коммитов в этом состоянии не затрагивая любые ветки и
не переходя на них.
Если вы хотите создать новую ветку и сохранить свои коммиты, то вы
можете сделать это (сейчас или позже) вызвав команду checkout снова,
но с параметром -b. Например:
git checkout -b <имя-новой-ветки>
HEAD сейчас на xxxxxxxx... Add latest GTest release. (#xxxx)
$ git remote show
origin
$ hub fork # создаем ответвление (копию)
$ git remote show
${GITHUB_USERNAME}
origin
$ git remote show ${GITHUB_USERNAME}
* внешний репозиторий
URL для извлечения: https://github.com/${GITHUB_USERNAME}/hunter.git
URL для отправки: https://github.com/${GITHUB_USERNAME}/hunter.git
HEAD ветка: master
Внешние ветки:
master отслеживается
testing-packages отслеживается
Локальная ссылка, настроенная для «git push»:
master будет отправлена в master (уже актуальна)
Создаем конфигурационный файл hunter.cmake
$ mkdir cmake/projects/print
$ cat > cmake/projects/print/hunter.cmake <<EOF
include(hunter_add_version)
include(hunter_cacheable)
include(hunter_cmake_args)
include(hunter_download)
include(hunter_pick_scheme)
hunter_add_version(
PACKAGE_NAME
print
VERSION
"0.1.0.0"
URL
"https://github.com/${GITHUB_USERNAME}/Labs/archive/v0.1.0.0.tar.gz"
SHA1
${PRINT_SHA1}
)
hunter_pick_scheme(DEFAULT url_sha1_cmake)
hunter_cmake_args(
print
CMAKE_ARGS
BUILD_EXAMPLES=NO
BUILD_TESTS=NO
)
hunter_cacheable(print)
hunter_download(PACKAGE_NAME print)
EOF
Добавляем в конфигурационный файл версию print
$ cat >> cmake/configs/default.cmake <<EOF
hunter_config(print VERSION 0.1.0.0)
EOF
Отправляем все изменения в скопированный репозиторий и устанавливаем метку версии v0.19.137.1
$ git add .
$ git commit -m"added print package"
$ git push ${GIHUB_USERNAME} master
$ git tag v0.19.137.1
$ git push ${GIHUB_USERNAME} master --tags
$ cd ..
Скачиваем учебный репозиторий и создаем в нем новую ветку lab10
$ export HUNTER_ROOT=`pwd`/hunter
$ mkdir lab10 && cd lab10
$ git clone https://github.com/Neisoweli/Labs
$ git checkout -b lab10
Создаем файл исходного кода demo.cpp
, использующий ранее созданную библиотеку print
$ mkdir sources
$ cat > sources/demo.cpp <<EOF
#include <print.hpp>
int main(int argc, char** argv) {
std::string text;
while(std::cin >> text) {
std::ofstream out("log.txt", std::ios_base::app);
print(text, out);
out << std::endl;
}
}
EOF
Скачиваем архив из репозитория gate и переносим из него файл HunterGate.cmake
для работы утилиты Hunter
$ wget https://github.com/hunter-packages/gate/archive/v0.20.30.tar.gz
$ tar -xzvf v0.20.30.tar.gz gate-0.20.30/cmake/HunterGate.cmake
$ mkdir cmake
$ mv gate-0.8.1/cmake/HunterGate.cmake cmake
$ rm -rf gate*/
$ rm *.tar.gz
Скачиваем архив из скопированного репозитория Hunter и берем его хэш-сумму
$ wget https://github.com/${GITHUB_USERNAME}/hunter/archive/v0.19.137.1.tar.gz
$ export HUNTER_SHA1=`openssl sha1 v0.19.137.1.tar.gz | cut -d'=' -f2 | cut -c2-41`
$ echo $HUNTER_SHA1 # вывод хэш суммы архива Hunter
${HUNTER_SHA1}
$ rm -rf v0.19.137.1.tar.gz
Создаем конфигурационный файл CMakeLists.txt
для сборки проекта
$ cat > CMakeLists.txt <<EOF
cmake_minimum_required(VERSION 3.0)
set(CMAKE_CXX_STANDARD 11)
include(cmake/HunterGate.cmake)
# устанавливаем расположение hunter и хэш-сумму архива
HunterGate(
URL "https://github.com/${GITHUB_USERNAME}/hunter/archive/v0.19.137.1.tar.gz"
SHA1 "${HUNTER_SHA1}"
)
project(demo)
# устанавливаем наименование добавляемой библиотеки
hunter_add_package(print)
find_package(print)
add_executable(demo \${CMAKE_CURRENT_SOURCE_DIR}/sources/demo.cpp)
target_link_libraries(demo print)
install(TARGETS demo RUNTIME DESTINATION bin)
EOF
Создаем файл .gitignore
, который устанавливает для утилиты git неотслеживаемые файлы
$ cat > .gitignore <<EOF
*build*/
*install*/
*.swp
EOF
Добавляем в README.md
статус сборки demo проекта
$ cat > README.md <<EOF
[](https://travis-ci.org/${GITHUB_USERNAME}/Labs)
the demo application redirects data from stdin to a file **log.txt** using a package **print**.
EOF
Создаем конфигурационный файл для сервиса TravisCI
$ cat > .travis.yml <<EOF
language: cpp
script:
- cmake -H. -B_build
- cmake --build _build
EOF
Проверяем корректность созданного конфигурационного файла
$ travis lint
Hooray, .travis.yml looks valid :)
Отправляем все изменения в репозиторий
$ git add .
$ git commit -m"first commit"
$ git push --set-upstream origin lab10
Инициализируем сборку в сервисе TravisCI
$ travis login --auto
$ travis enable
Производим сборку проекта и проверяем его работоспособность
$ cmake -H. -B_build -DCMAKE_INSTALL_PREFIX=_install
$ cmake --build _build --target install
$ mkdir artifacts && cd artifacts
$ echo "text1 text2 text3" | ../_install/bin/demo
$ cat log.txt
text1
text2
text3
Copyright (c) 2017 Братья Вершинины