In diesem Beitrag wird erläutert, wie Sie ein C ++ - Projekt mit GTest und Boost mit Docker erstellen. Der Artikel ist ein Rezept mit einigen erklärenden Kommentaren, die im Artikel vorgestellte Lösung gibt nicht vor, produktionsbereit zu sein.
Warum und wer könnte es brauchen?
Angenommen, Sie mögen wie ich das Konzept von Python venv wirklich, wenn sich alle erforderlichen Abhängigkeiten in einem separaten, streng definierten Verzeichnis befinden. oder Sie müssen eine einfache Portabilität der Montage- und Testumgebung für das in der Entwicklung befindliche Projekt bereitstellen, was beispielsweise sehr praktisch ist, wenn Sie einen neuen Entwickler in das Team aufnehmen.
Dieser Artikel ist besonders nützlich für Anfänger, die grundlegende Umgebungseinstellungen zum Erstellen und Ausführen eines C ++ - Projekts vornehmen müssen.
Die im Artikel vorgestellte Umgebung kann als Rahmen für Testaufgaben oder Laborarbeiten verwendet werden.
Installieren Sie Docker
Alles, was Sie zur Implementierung des in diesem Artikel vorgestellten Projekts benötigen, ist Docker und Internetzugang.
Docker ist für Windows-, Linux- und Mac-Plattformen verfügbar. Die offizielle Dokumentation .
Da ich einen Windows-Computer an Bord verwende, musste ich nur das Installationsprogramm herunterladen und ausführen.
Bitte beachten Sie, dass Docker für Windows derzeit Hyper-V für seine Arbeit verwendet.
Projekt
Als Projekt meinen wir eine CommandLine-Anwendung, die die Zeichenfolge "Hello World!" zum Standardausgabestream.
Das Projekt verwendet die erforderlichen Mindestbibliotheken sowie CMake als Build-System.
Die Struktur unseres Projekts wird wie folgt sein:
project | Dockerfile | \---src CMakeLists.txt main.cpp sample_hello_world.h test.cpp
Die Datei CMakeLists.txt enthält eine Beschreibung des Projekts.
Quellcode der Datei:
cmake_minimum_required(VERSION 3.2) project(HelloWorldProject)
Die Datei sample_hello_world.h enthält eine Beschreibung der HelloWorld-Klasse, von der eine Instanz an den Stream gesendet wird. Die Zeichenfolge "Hello World!" Wird angezeigt. Diese Komplexität ist auf die Notwendigkeit zurückzuführen, den Code unserer Anwendung zu testen.
Quellcode der Datei:
#ifndef SAMPLE_HELLO_WORLD_H #define SAMPLE_HELLO_WORLD_H namespace sample { struct HelloWorld { template<class OS> friend OS& operator<<(OS& os, const HelloWorld&) { os << "Hello World!"; return os; } }; } // sample #endif // SAMPLE_HELLO_WORLD_H
Die Datei main.cpp enthält den Einstiegspunkt unserer Anwendung. Außerdem fügen wir Boost.Program_options hinzu , um ein reales Projekt zu simulieren.
Quellcode der Datei:
#include "sample_hello_world.h" #include <boost/program_options.hpp> #include <iostream> // - "--help" auto parseArgs(int argc, char* argv[]) { namespace po = boost::program_options; po::options_description desc("Allowed options"); desc.add_options() ("help,h", "Produce this message"); auto parsed = po::command_line_parser(argc, argv) .options(desc) .allow_unregistered() .run(); po::variables_map vm; po::store(parsed, vm); po::notify(vm); // C++17 std::make_pair return std::pair(vm, desc); } int main(int argc, char* argv[]) try { auto [vm, desc] = parseArgs(argc, argv); if (vm.count("help")) { std::cout << desc << std::endl; return 0; } std::cout << sample::HelloWorld{} << std::endl; return 0; } catch (std::exception& e) { std::cerr << "Unhandled exception: " << e.what() << std::endl; return -1; }
Die Datei test.cpp enthält das erforderliche Minimum - einen Test der Funktionalität der HelloWorld-Klasse. Zum Testen verwenden wir GoogleTest .
Quellcode der Datei:
#include "sample_hello_world.h" #include <sstream> #include <gtest/gtest.h> // , HelloWorld , TEST(HelloWorld, Test) { std::ostringstream oss; oss << sample::HelloWorld{}; ASSERT_EQ("Hello World!", oss.str()); } // int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
Als nächstes kommen wir zum interessantesten Teil - dem Einrichten Ihrer Build-Umgebung mit Dockerfile!
Dockerfile
Für die Montage verwenden wir gcc der neuesten Version.
Dockerfile besteht aus zwei Phasen: Erstellen und Starten unserer Anwendung.
Verwenden Sie zum Ausführen die neueste Version von Ubuntu.
Dockerfile-Inhalt:
# --------------------------------------- # gcc:latest FROM gcc:latest as build # GoogleTest WORKDIR /gtest_build # GoogleTest # , # Docker RUN , # , , RUN apt-get update && \ apt-get install -y \ libboost-dev libboost-program-options-dev \ libgtest-dev \ cmake \ && \ cmake -DCMAKE_BUILD_TYPE=Release /usr/src/gtest && \ cmake --build . && \ mv lib*.a /usr/lib # /src ADD ./src /app/src # WORKDIR /app/build # , RUN cmake ../src && \ cmake --build . && \ CTEST_OUTPUT_ON_FAILURE=TRUE cmake --build . --target test # --------------------------------------- # ubuntu:latest FROM ubuntu:latest # , Docker root # root' :) RUN groupadd -r sample && useradd -r -g sample sample USER sample # WORKDIR /app # COPY --from=build /app/build/hello_world_app . # ENTRYPOINT ["./hello_world_app"]
Ich denke, jetzt erstmal die Anwendung erstellen und ausführen!
Montage und Start
Um unsere Anwendung zu erstellen und ein Docker-Image zu erstellen, müssen Sie den folgenden Befehl ausführen:
Verwenden Sie den Befehl, um die Anwendung zu starten:
> docker run docker-cpp-sample
Wir werden die geschätzten Worte sehen:
Hello World!
Um einen Parameter zu übergeben, reicht es aus, ihn dem obigen Befehl hinzuzufügen:
> docker run docker-cpp-sample --help Allowed options: -h [ --help ] Produce this message
Zusammenfassend
Als Ergebnis haben wir eine vollwertige C ++ - Anwendung erstellt, die Umgebung zum Erstellen und Ausführen unter Linux konfiguriert und in einen Docker-Container verpackt. So müssen nachfolgende Entwickler keine Zeit mehr für die Einrichtung einer lokalen Assembly aufwenden.