ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΡ‹ Π½Π° Π‘++. Π’Ρ‹Π΄ΡƒΠΌΠΊΠ° ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ?

ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΡ‹ Π½Π° Π‘++. Π’Ρ‹Π΄ΡƒΠΌΠΊΠ° ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ?

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я расскаТу ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ создал шаблон (cookiecutter) ΠΈ настроил ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ для написания REST API сСрвиса Π½Π° Π‘++ с использованиСм docker/docker-compose ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° conan.

Π’ΠΎ врСмя ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Ρ…Π°ΠΊΠ°Ρ‚ΠΎΠ½Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я участвовал Π² качСствС Π±Π΅ΠΊΠ΅Π½Π΄-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°, встал вопрос ΠΎ Ρ‚ΠΎΠΌ, Π½Π° Ρ‡Π΅ΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ микросСрвис. ВсС Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ написано Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚, писалось ΠΌΠ½ΠΎΠΉ ΠΈ ΠΌΠΎΠΈΠΌ Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰Π΅ΠΌ Π½Π° языкС Python, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° Π±Ρ‹Π» спСциалистом Π² этой области ΠΈ ΠΏΡ€ΠΎΡ„Π΅ΡΡΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ занимался Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π±Π΅ΠΊΠ΅Π½Π΄ΠΎΠ², Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ я Π²ΠΎΠΎΠ±Ρ‰Π΅ являлся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ ΠΏΠΎΠ΄ встроСнныС систСмы ΠΈ писал Π½Π° Π²Π΅Π»ΠΈΠΊΠΎΠΌ ΠΈ уТасном Π‘++, Π° Python просто ΠΏΠΎΠ΄ΡƒΡ‡ΠΈΠ» Π² унивСрситСтС.

Π’Π°ΠΊ Π²ΠΎΡ‚, ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ встала Π·Π°Π΄Π°Ρ‡Π° Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ высоконагруТСнный сСрвис, основной Π·Π°Π΄Π°Ρ‡Π΅ΠΉ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π» прСпроцСссинг ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΡ… ΠΊ Π½Π΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ запись ΠΈΡ… Π² Π‘Π”. И послС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΡƒΡ€Π° Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΌΠ½Π΅, ΠΊΠ°ΠΊ Π‘++ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ, Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ этот сСрвис Π½Π° ΠΏΠ»ΡŽΡΠ°Ρ…. АргумСнтируя это Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ быстрСС, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅, Π΄Π° ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅, ΠΆΡŽΡ€ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π² восторгС ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΌΠ΅Π΅ΠΌ Ρ€Π°ΡΠΏΠΎΡ€ΡΠΆΠ°Ρ‚ΡŒΡΡ рСсурсами ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. На Ρ‡Ρ‚ΠΎ я ΠΎΡ‚Π²Π΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ занимался Ρ‚Π°ΠΊΠΈΠΌΠΈ Π²Π΅Ρ‰Π°ΠΌΠΈ Π½Π° Π‘++ ΠΈ с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ ΠΌΠΎΠ³Ρƒ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ 20+ часов ΠΏΠΎΡΠ²ΡΡ‚ΠΈΡ‚ΡŒ поиску, компиляции ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ подходящих Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠŸΡ€ΠΎΡ‰Π΅ говоря, я струсил. На Ρ‚ΠΎΠΌ ΠΈ ΠΏΠΎΡ€Π΅ΡˆΠΈΠ»ΠΈ ΠΈ спокойно дописали всС Π½Π° Python.

БСйчас ΠΆΠ΅, Π²ΠΎ врСмя Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Π½ΠΎΠΉ самоизоляции я Ρ€Π΅ΡˆΠΈΠ»ΡΡ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ сСрвисы Π½Π° Π‘++. ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с подходящСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ. Мой Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ°Π» Π½Π° POCO, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° Π±Ρ‹Π»Π° написана Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ стилС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³Π»Π° ΠΏΠΎΡ…Π²Π°ΡΡ‚Π°Ρ‚ΡŒΡΡ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ. Π’Π°ΠΊΠΆΠ΅, встал вопрос ΠΎ Π²Ρ‹Π±ΠΎΡ€Π΅ систСмы сборки. Π― Π΄ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π°Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Visual Studio, IAR ΠΈ Β«Π³ΠΎΠ»Ρ‹ΠΌΠΈΒ» makefile. И Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· этих систСм мСня Π½Π΅ ΠΏΡ€Π΅Π»ΡŒΡ‰Π°Π»Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ я ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π» Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ вСсь сСрвис Π² docker-ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅. Π’ΠΎΠ³Π΄Π° я Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с cmake ΠΈ интСрСсным ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ conan. Π­Ρ‚ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ позволял ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ всС зависимости Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅

conanfile.txt
[requires] poco/1.9.3
libpq/11.5

[generators] cmake

ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ простой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Β«conan install .Β» ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ЕстСствСнно, Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ внСсти измСнСния Π²

CMakeLists.txt

include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})

ПослС этого я Π½Π°Ρ‡Π°Π» ΠΈΡΠΊΠ°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PostgreSQL, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ с Π½Π΅ΠΉ Ρƒ мСня имСлся нСбольшой ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ с Π½Π΅ΠΉ взаимодСйствовали наши сСрвисы Π½Π° Python. И Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ я ΡƒΠ·Π½Π°Π»? Она Π΅ΡΡ‚ΡŒ Π² POCO! Но conan Π½Π΅ Π·Π½Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π΅ΡΡ‚ΡŒ Π² POCO ΠΈ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π΅Π΅ Π±ΠΈΠ»Π΄ΠΈΡ‚ΡŒ, Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π»Π΅ΠΆΠΈΡ‚ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (я ΡƒΠΆΠ΅ написал ΠΎΠ± этой ошибкС создатСлям POCO). А Π·Π½Π°Ρ‡ΠΈΡ‚, придСтся ΠΈΡΠΊΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

И Ρ‚ΠΎΠ³Π΄Π° ΠΌΠΎΠΉ Π²Ρ‹Π±ΠΎΡ€ ΠΏΠ°Π» Π½Π° ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ libpg. И ΠΌΠ½Π΅ нСсказанно ΠΏΠΎΠ²Π΅Π·Π»ΠΎ, ΠΎΠ½Π° ΡƒΠΆΠ΅ Π±Ρ‹Π»Π° Π² conan ΠΈ Π΄Π°ΠΆΠ΅ ΡΠΎΠ±ΠΈΡ€Π°Π»Π°ΡΡŒ ΠΈ компоновалась.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π±Ρ‹Π»ΠΎ написаниС шаблона сСрвиса, ΡƒΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ запросы.
ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ наш класс TemplateServerApp ΠΎΡ‚ Poco::Util::ServerApplication ΠΈ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ main.

TemplateServerApp

#pragma once

#include <string>
#include <vector>
#include <Poco/Util/ServerApplication.h>

class TemplateServerApp : public Poco::Util::ServerApplication
{
    protected:
        int main(const std::vector<std::string> &);
};

int TemplateServerApp::main(const vector<string> &)
{
    HTTPServerParams* pParams = new HTTPServerParams;

    pParams->setMaxQueued(100);
    pParams->setMaxThreads(16);

    HTTPServer s(new TemplateRequestHandlerFactory, ServerSocket(8000), pParams);

    s.start();
    cerr << "Server started" << endl;

    waitForTerminationRequest();  // wait for CTRL-C or kill

    cerr << "Shutting down..." << endl;
    s.stop();

    return Application::EXIT_OK;
}

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ main ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹: ΠΏΠΎΡ€Ρ‚, количСство ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. А самоС Π³Π»Π°Π²Π½ΠΎΠ΅, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ входящих запросов. ДСлаСтся это посрСдством создания Ρ„Π°Π±Ρ€ΠΈΠΊΠΈ

TemplateRequestHandlerFactory

class TemplateRequestHandlerFactory : public HTTPRequestHandlerFactory
{
public:
    virtual HTTPRequestHandler* createRequestHandler(const HTTPServerRequest & request)
    {
        return new TemplateServerAppHandler;
    }
};

Π’ ΠΌΠΎΠ΅ΠΌ случаС ΠΎΠ½Π° просто ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· создаСт ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ β€” TemplateServerAppHandler. ИмСнно здСсь ΠΌΡ‹ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π°ΡˆΡƒ бизнСс-Π»ΠΎΠ³ΠΈΠΊΡƒ.

TemplateServerAppHandler

class TemplateServerAppHandler : public HTTPRequestHandler
{
public:
    void handleRequest(HTTPServerRequest &req, HTTPServerResponse &resp)
    {
        URI uri(req.getURI());
        string method = req.getMethod();

        cerr << "URI: " << uri.toString() << endl;
        cerr << "Method: " << req.getMethod() << endl;

        StringTokenizer tokenizer(uri.getPath(), "/", StringTokenizer::TOK_TRIM);
        HTMLForm form(req,req.stream());

        if(!method.compare("POST"))
        {
            cerr << "POST" << endl;
        }
        else if(!method.compare("PUT"))
        {
            cerr << "PUT" << endl;
        }
        else if(!method.compare("DELETE"))
        {
            cerr << "DELETE" << endl;
        }

        resp.setStatus(HTTPResponse::HTTP_OK);
        resp.setContentType("application/json");
        ostream& out = resp.send();

        out << "{"hello":"heh"}" << endl;
        out.flush();
    }
};

Π’Π°ΠΊΠΆΠ΅ я создал шаблон класса для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с PostgreSQL. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ простой SQL, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ExecuteSQL(). Для Π±ΠΎΠ»Π΅Π΅ слоТных запросов ΠΈΠ»ΠΈ получСния Π΄Π°Π½Π½Ρ‹Ρ… придСтся ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ connection Ρ‡Π΅Ρ€Π΅Π· GetConnection() ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ API libpg. (Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌ я ΠΈΡΠΏΡ€Π°Π²Π»ΡŽ эту Π½Π΅ΡΠΏΡ€Π°Π²Π΅Π΄Π»ΠΈΠ²ΠΎΡΡ‚ΡŒ).

Database

#pragma once

#include <memory>
#include <mutex>
#include <libpq-fe.h>

class Database
{
public:
    Database();
    std::shared_ptr<PGconn> GetConnection() const;
    bool ExecuteSQL(const std::string& sql);

private:
    void establish_connection();
    void LoadEnvVariables();

    std::string m_dbhost;
    int         m_dbport;
    std::string m_dbname;
    std::string m_dbuser;
    std::string m_dbpass;

    std::shared_ptr<PGconn>  m_connection;
};

ВсС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… бСрутся ΠΈΠ· окруТСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» .env

.env

DATABASE_NAME=template
DATABASE_USER=user
DATABASE_PASSWORD=password
DATABASE_HOST=postgres
DATABASE_PORT=5432

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ вСсь ΠΊΠΎΠ΄ Π½Π° Π³ΠΈΡ‚Ρ…Π°Π±Π΅.

ΠœΠΈΠΊΡ€ΠΎΡΠ΅Ρ€Π²ΠΈΡΡ‹ Π½Π° Π‘++. Π’Ρ‹Π΄ΡƒΠΌΠΊΠ° ΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ?

И настал послСдний этап написания dockerfile ΠΈ docker-compose.yml. Π‘ΠΊΠ°ΠΆΡƒ чСстно, Π½Π° это ΡƒΡˆΠ»Π° большая Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ я Π½ΡƒΠ±, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π±Ρ‹Π»ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π° ΠΈΠ·-Π·Π° ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹Ρ… ΠΊΠ°ΠΌΠ½Π΅ΠΉ conan. Π’Π°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ conan скачал, установил ΠΈ ΠΏΠΎΠ±ΠΈΠ»Π΄ΠΈΠ» Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ зависимости, Π΅ΠΌΡƒ ΠΌΠ°Π»ΠΎ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Β«conan install .Β», Π΅ΠΌΡƒ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -s compiler.libcxx=libstdc++11, ΠΈΠ½Π°Ρ‡Π΅ Π²Ρ‹ рискуСтС ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΡƒΡ‡Ρƒ ошибок Π½Π° этапС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ вашСго прилоТСния. Π― просидСл с этой ошибкой нСсколько часов, ΠΈ надСюсь, Ρ‡Ρ‚ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΈΠΌ людям Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π·Π° Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ΅ врСмя.

Π”Π°Π»Π΅Π΅, послС написания docker-compose.yml, ΠΏΠΎ совСту своСго Ρ‚ΠΎΠ²Π°Ρ€ΠΈΡ‰Π° я Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ cookiecutter ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ сСбС ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ шаблон для REST API сСрвиса Π½Π° Π‘++, c настроСнным ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΈ поднятой PostgreSQL, просто ввСдя Π² консоль Β«cookiecutter https://github.com/KovalevVasiliy/cpp_rest_api_template.gitΒ». А Π·Π°Ρ‚Π΅ΠΌ Β«docker-compose up —buildΒ».

НадСюсь, Π΄Π°Π½Π½Ρ‹ΠΉ шаблон ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ°ΠΌ Π½Π° ΠΈΡ… Π½Π΅Π»Π΅Π³ΠΊΠΎΠΌ ΠΏΡƒΡ‚ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ REST API ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π²Π΅Π»ΠΈΠΊΠΎΠΌ ΠΈ ΠΌΠΎΠ³ΡƒΡ‡Π΅ΠΌ, Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΌ Π½Π΅ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π»ΠΈΠ²ΠΎΠΌ языкС, ΠΊΠ°ΠΊ Π‘++.
Π’Π°ΠΊΠΆΠ΅, я ΠΎΡ‡Π΅Π½ΡŒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π²ΠΎΡ‚ эту ΡΡ‚Π°Ρ‚ΡŒΡŽ. Π’ Π½Π΅ΠΉ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с POCO ΠΈ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой REST API сСрвис.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ