Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ Ρ ΡΠ°ΡΡΠΊΠ°ΠΆΡ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Π» ΡΠ°Π±Π»ΠΎΠ½ (cookiecutter) ΠΈ Π½Π°ΡΡΡΠΎΠΈΠ» ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ REST API ΡΠ΅ΡΠ²ΠΈΡΠ° Π½Π° Π‘++ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ docker/docker-compose ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° conan.
ΠΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Ρ
Π°ΠΊΠ°ΡΠΎΠ½Π°, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Ρ ΡΡΠ°ΡΡΠ²ΠΎΠ²Π°Π» Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π΅ΠΊΠ΅Π½Π΄-ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, Π²ΡΡΠ°Π» Π²ΠΎΠΏΡΠΎΡ ΠΎ ΡΠΎΠΌ, Π½Π° ΡΠ΅ΠΌ ΠΏΠΈΡΠ°ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠΉ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΡ. ΠΡΠ΅ ΡΡΠΎ Π±ΡΠ»ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΏΠΈΡΠ°Π»ΠΎΡΡ ΠΌΠ½ΠΎΠΉ ΠΈ ΠΌΠΎΠΈΠΌ
Π’Π°ΠΊ Π²ΠΎΡ, ΠΏΠ΅ΡΠ΅Π΄ Π½Π°ΠΌΠΈ Π²ΡΡΠ°Π»Π° Π·Π°Π΄Π°ΡΠ° Π½Π°ΠΏΠΈΡΠ°ΡΡ Π²ΡΡΠΎΠΊΠΎΠ½Π°Π³ΡΡΠΆΠ΅Π½Π½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ, ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π·Π°Π΄Π°ΡΠ΅ΠΉ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π±ΡΠ» ΠΏΡΠ΅ΠΏΡΠΎΡΠ΅ΡΡΠΈΠ½Π³ ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΡ ΠΊ Π½Π΅ΠΌΡ Π΄Π°Π½Π½ΡΡ ΠΈ Π·Π°ΠΏΠΈΡΡ ΠΈΡ Π² ΠΠ. Π ΠΏΠΎΡΠ»Π΅ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΡΡΠ° ΡΠΎΠ²Π°ΡΠΈΡ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΠ» ΠΌΠ½Π΅, ΠΊΠ°ΠΊ Π‘++ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ, Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΎΡ ΡΠ΅ΡΠ²ΠΈΡ Π½Π° ΠΏΠ»ΡΡΠ°Ρ . ΠΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΡΡ ΡΡΠΎ ΡΠ΅ΠΌ, ΡΡΠΎ ΡΠ°ΠΊ Π±ΡΠ΄Π΅Ρ Π±ΡΡΡΡΠ΅Π΅, ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½Π΅Π΅, Π΄Π° ΠΈ Π²ΠΎΠΎΠ±ΡΠ΅, ΠΆΡΡΠΈ Π±ΡΠ΄ΡΡ Π² Π²ΠΎΡΡΠΎΡΠ³Π΅ ΠΎΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΌΡ ΡΠΌΠ΅Π΅ΠΌ ΡΠ°ΡΠΏΠΎΡΡΠΆΠ°ΡΡΡΡ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ. ΠΠ° ΡΡΠΎ Ρ ΠΎΡΠ²Π΅ΡΠΈΠ», ΡΡΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π½ΠΈΠΌΠ°Π»ΡΡ ΡΠ°ΠΊΠΈΠΌΠΈ Π²Π΅ΡΠ°ΠΌΠΈ Π½Π° Π‘++ ΠΈ Ρ Π»Π΅Π³ΠΊΠΎΡΡΡΡ ΠΌΠΎΠ³Ρ ΠΎΡΡΠ°Π²ΡΠΈΠ΅ΡΡ 20+ ΡΠ°ΡΠΎΠ² ΠΏΠΎΡΠ²ΡΡΠΈΡΡ ΠΏΠΎΠΈΡΠΊΡ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊ. ΠΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Ρ ΡΡΡΡΡΠΈΠ». ΠΠ° ΡΠΎΠΌ ΠΈ ΠΏΠΎΡΠ΅ΡΠΈΠ»ΠΈ ΠΈ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ Π΄ΠΎΠΏΠΈΡΠ°Π»ΠΈ Π²ΡΠ΅ Π½Π° Python.
Π‘Π΅ΠΉΡΠ°Ρ ΠΆΠ΅, Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Π½ΠΎΠΉ ΡΠ°ΠΌΠΎΠΈΠ·ΠΎΠ»ΡΡΠΈΠΈ Ρ ΡΠ΅ΡΠΈΠ»ΡΡ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΡΠ²ΠΈΡΡ Π½Π° Π‘++. ΠΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡΡ Ρ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΎΠΉ. ΠΠΎΠΉ Π²ΡΠ±ΠΎΡ ΠΏΠ°Π» Π½Π°
conanfile.txt
[requires]
poco/1.9.3
libpq/11.5
ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Β«conan install .Β» ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ. ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ, ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ΅Π±ΠΎΠ²Π°Π»ΠΎΡΡ Π²Π½Π΅ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²
CMakeLists.txt
include(build/conanbuildinfo.cmake)
conan_basic_setup()
target_link_libraries(<target_name> ${CONAN_LIBS})
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Ρ Π½Π°ΡΠ°Π» ΠΈΡΠΊΠ°ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ PostgreSQL, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ Π½Π΅ΠΉ Ρ ΠΌΠ΅Π½Ρ ΠΈΠΌΠ΅Π»ΡΡ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΎΠΏΡΡ ΡΠ°Π±ΠΎΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ Π½Π΅ΠΉ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°Π»ΠΈ Π½Π°ΡΠΈ ΡΠ΅ΡΠ²ΠΈΡΡ Π½Π° Python. Π Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ Ρ ΡΠ·Π½Π°Π»? ΠΠ½Π° Π΅ΡΡΡ Π² POCO! ΠΠΎ conan Π½Π΅ Π·Π½Π°Π΅Ρ, ΡΡΠΎ ΠΎΠ½Π° Π΅ΡΡΡ Π² POCO ΠΈ Π½Π΅ ΡΠΌΠ΅Π΅Ρ Π΅Π΅ Π±ΠΈΠ»Π΄ΠΈΡΡ, Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π»Π΅ΠΆΠΈΡ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΡΠΉ ΡΠ°ΠΉΠ» (Ρ ΡΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°Π» ΠΎΠ± ΡΡΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠ΅ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»ΡΠΌ POCO). Π Π·Π½Π°ΡΠΈΡ, ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΈΡΠΊΠ°ΡΡ Π΄ΡΡΠ³ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ.
Π ΡΠΎΠ³Π΄Π° ΠΌΠΎΠΉ Π²ΡΠ±ΠΎΡ ΠΏΠ°Π» Π½Π° ΠΌΠ΅Π½Π΅Π΅ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΌ ΡΠ°Π³ΠΎΠΌ Π±ΡΠ»ΠΎ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° ΡΠ΅ΡΠ²ΠΈΡΠ°, ΡΠΌΠ΅ΡΡΠ΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ.
ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ Π½Π°Ρ ΠΊΠ»Π°ΡΡ 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, ΠΏΠΎ ΡΠΎΠ²Π΅ΡΡ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ²Π°ΡΠΈΡΠ° Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ
ΠΠ°Π΄Π΅ΡΡΡ, Π΄Π°Π½Π½ΡΠΉ ΡΠ°Π±Π»ΠΎΠ½ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π½ΠΎΠ²ΠΈΡΠΊΠ°ΠΌ Π½Π° ΠΈΡ
Π½Π΅Π»Π΅Π³ΠΊΠΎΠΌ ΠΏΡΡΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ REST API ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π²Π΅Π»ΠΈΠΊΠΎΠΌ ΠΈ ΠΌΠΎΠ³ΡΡΠ΅ΠΌ, Π½ΠΎ ΡΠ°ΠΊΠΎΠΌ Π½Π΅ΠΏΠΎΠ²ΠΎΡΠΎΡΠ»ΠΈΠ²ΠΎΠΌ ΡΠ·ΡΠΊΠ΅, ΠΊΠ°ΠΊ Π‘++.
Π’Π°ΠΊΠΆΠ΅, Ρ ΠΎΡΠ΅Π½Ρ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ ΠΏΡΠΎΡΠΈΡΠ°ΡΡ Π²ΠΎΡ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com