Was versucht dieses Projekt für mich zu tun?
Machen Sie es einfach, HTTPS -Anfragen von C ++ (oder C) zu stellen.
Warum dieses Projekt verwenden, um eine C ++ - HTTPS -Client -Bibliothek zu erhalten?
C ++ fehlt bekanntlich die Networking -Unterstützung. Wenn Sie dies lesen, vermuten wir, dass Sie in der gleichen Position sind, die wir waren: Wir mussten dieses Loch für uns selbst füllen und waren mit den anderen Optionen, die wir sahen, nicht zufrieden. Wir haben diesen Code geschrieben, weil alle anderen Bazel -Regeln, die wir gesehen haben, ernsthafte Probleme beim Wickeln von Curl haben, unabhängig davon, ob dies die Misskonfiguration in der Datei des Tensorflows ist, die Speicherfehler oder CMake -Verpackungen verursacht, die keine Bazel -Einstellungen oder Cross -Kompilien ordnungsgemäß behandeln. Das Ziel hier ist es, eine leicht wiederverwendbare Komponente zu erstellen, die es für alle richtig macht.
Grundlegende Setup -Zeit: 2m
Grüß dich, Bazel -Benutzer? Lassen Sie uns in kürzester Zeit eine HTTPS -Anfrage stellen.
Hier gibt es eine Reihe von Text, aber nur, weil wir versuchen, Dinge zu buchstabieren und sie einfach zu machen. Wenn Sie Probleme haben, lassen Sie es uns wissen. Wir würden Ihre Hilfe lieben, um die Dinge noch besser und vollständiger zu machen - und wir würden Ihnen gerne helfen!
Kopieren Sie dies in Ihre Bazel WORKSPACE -Datei, um dieses Repo als externe Abhängigkeit hinzuzufügen, und stellen Sie sicher, dass Sie den neuesten Commit gemäß den folgenden Anweisungen aktualisieren.
load ( "@bazel_tools//tools/build_defs/repo:http.bzl" , "http_archive" )
# Hedron's Bazel Rules for C++ HTTPS Requests
# Makes @cpr, @curl, and @boringssl available for use
# https://github.com/hedronvision/bazel-make-cc-https-easy
# This also brings in @hedron_std_filesystem_backport to enable CPR across-platforms.
# Lets you use the std::filesystem API on Apple platforms, where it wouldn't otherwise be available. # (Deployment targets before macOS 10.15, iOS/tvOS 13.0, and watchOS 6.0)
# Just use fs:: as a drop-in replacement for std::filesystem.
# For more, see: https://github.com/hedronvision/bazel-cc-filesystem-backport
http_archive (
name = "hedron_make_cc_https_easy" ,
# Replace the commit hash in both places (below) with the latest, rather than using the stale one here.
# Even better, set up Renovate and let it do the work for you (see "Suggestion: Updates" in the README).
url = "https://github.com/hedronvision/bazel-make-cc-https-easy/archive/315416306204ce6bb2983b4a923815a7e89eb727.tar.gz" ,
strip_prefix = "bazel-make-cc-https-easy-315416306204ce6bb2983b4a923815a7e89eb727" ,
# When you first run this tool, it'll recommend a sha256 hash to put here with a message like: "DEBUG: Rule 'hedron_make_cc_https_easy' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = ..."
)
load ( "@hedron_make_cc_https_easy//:workspace_setup.bzl" , "hedron_make_cc_https_easy" )
hedron_make_cc_https_easy ()
load ( "@hedron_make_cc_https_easy//:transitive_workspace_setup.bzl" , "hedron_keep_cc_https_easy" )
hedron_keep_cc_https_easy ()Wie bei allen plattformabhängigen C/C ++ in Basel müssen Sie Bazel 7+ (und eine ähnlich aktuelle Version von Rules_Apple) verwenden, damit die Konfiguration pro Plattform automatisch nicht mehr über die Box funktioniert. (Bitte stellen Sie einen PR ein, um diesen Abschnitt zu löschen, wenn Bazel 7 jetzt so alt wie Standard ist.)
Sie müssen sicherstellen, dass die LiBCurl -Entwicklungsheader installiert sind, damit Sie sie aus Ihrem Code verwenden können.
Führen Sie sudo apt-get install libcurl4-openssl-dev (Debian/Ubuntu) oder das Äquivalent für Ihre Verteilung aus. Für die Installation von Anweisungen für andere Verteilungen finden Sie hier libcurl -Einträge: https://ething.curl.dev/get/linux. Wenn Sie ein Binärpaket basierend auf Ihrem Code verteilen, sollten Sie eine Abhängigkeit von libcurl4 erklären oder Ihren Benutzern auf andere Weise sagen, dass sie sudo apt-get libcurl4 . Und wie immer, wenn Sie Dinge lernen, die zukünftigen Benutzern helfen würden, stellen Sie bitte eine PR oder ein Problem ein.
Als Hintergrund verfolgen wir den Ansatz, dynamisch mit Bibliotheken verknüpft zu sein, das das Betriebssystem zuverlässig liefern kann, und die Bündelung (bauen + statisch Verknüpfung) ansonsten. Linux ist ein Sonderfall, da ein großartiges Abhängigkeitsmanagementsystem eingebaut ist, sodass es zuverlässig mehr Bibliotheken liefern kann als mit dem Betriebssystem versendet werden.
Abgesehen davon: Es kommt uns an, dass es hier eine Chance für eine Bazel -Erweiterung gibt, mit der Bazel Linux -Paketmanager besser unterstützen können. Bitte sehen Sie diesen Vorschlag an, wenn Sie daran interessiert sind oder daran helfen, ihn zu hacken. Lassen Sie uns die Diskussion zu diesem Thema fortsetzen, ob Google daran interessiert ist, sie selbst zu implementieren.
Fügen Sie Ihren deps "@cpr" hinzu und verwenden Sie die wundervolle LIBCPR -Schnittstelle!
Weitere Informationen finden Sie in ihren Dokumenten, aber die Benutzeroberfläche ist wirklich wunderbar ergonomisch. Als Beispiel:
# include < cpr/cpr.h >
cpr::Response r = cpr::Get(cpr::Url{ " https://github.com " },
cpr::Parameters{{ " key " , " value " }});Weitere Informationen darüber, warum wir CPR ausgewählt und empfehlen, sehen Sie sich WhyCpr.md
Beachten Sie, dass Sie C ++ 17 oder höher aktivieren müssen, wenn Sie es noch nicht getan haben. Wir befriedigen dies, indem wir Folgendes in unsere .bazelrc einfügen:
build --cxxopt=-std=gnu++20
build --per_file_copt=.*.mm$@-std=gnu++20
Fügen Sie Ihren deps "@curl" hinzu und verwenden Sie Libcurl in allem, dass es üblich ist (Beispiel, Docs).
... oder implementieren Sie einfach Ihre C -Schnittstelle in C ++ (mit extern "C" ) und verwenden Sie LIBCPR.
Aber wir haben einen Vorschlag ...
Verbesserungen kommen häufig an die zugrunde liegenden Bibliotheken, einschließlich Sicherheitspatches, daher empfehlen wir, uns auf dem Laufenden zu halten.
Wir empfehlen dringend, dass Sie irgendwann Renovat (oder ähnlich) einrichten, um diese Abhängigkeit (und andere) standardmäßig auf dem neuesten Stand zu halten. [Wir sind nicht mit Renovat oder so verbunden, aber wir halten es für großartig. Es beobachtet neue Versionen und sendet Ihnen PRS zur Überprüfung oder automatisierten Tests. Es ist kostenlos und einfach eingerichtet. Es war erstaunlich nützlich in unserer Codebasis, und wir haben mit dem wunderbaren Betreuer zusammengearbeitet, um die Dinge für die Verwendung von Basel hervorragend zu machen. Und es wird in offiziellen Basel-Repositories verwendet-und in diesem!]
Wenn nicht jetzt, kehren Sie möglicherweise zu diesem Schritt später zurück oder sehen Sie sich dieses Repo nach Updates an. [Oder hey, vielleicht gib uns einen schnellen Stern, während du darüber nachdenkt.] Wie Abseil leben wir am Kopf; Der neueste Verpflichtung zum Hauptzweig ist das gewünschte Commit. Verlassen Sie sich also nicht auf Release -Benachrichtigungen. Verwenden Sie Renovate oder Umfrage manuell für neue Commits.
Weg, um es durch das Setup zu schaffen. Prost, die Leistung des Webs von C ++ einfach zu nutzen!
Dies sollte nahtlos für MacOS, Linux, Android, iOS, Watchos und TVOS funktionieren.
Wenn Sie es für Windows möchten, würden wir Ihre Hilfe lieben. Es sollte ein bisschen einfacher sein, Unterstützung hinzuzufügen, als sie selbst von Grund auf neu zu machen. Wir werden helfen. Und Ihr Code funktioniert dann kostenlos über Plattformen. Außerdem werden Sie allen helfen. Bitte wenden Sie sich über das Problem, wenn Sie es beginnen, nur um sicherzustellen, dass die Leute keine Bemühungen duplizieren.
Wenn Sie Bazel für C oder C ++ verwenden, möchten Sie wahrscheinlich auch einige unserer anderen Werkzeuge, wie ...