Was versucht dieses Projekt für mich zu tun?
Machen Sie es einfach, die API STD :: Dateisystem über Plattformen hinweg zu verwenden, auch wenn std :: Dateisystem sonst (bedingt) nicht verfügbar wären.
[Kein Bazel -Benutzer? Verwenden Sie einfach Gulrak/Dateisystem direkt.]
Warum kann ich Normalerweise STD :: Dateisystem nicht verwenden?
STD :: Dateisystem ist vor macOS 10.15, iOS/tvos 13.0 und watchos 6.0 nicht verfügbar, selbst mit C ++ 17. Wenn Sie versuchen, STD :: Dateisystem zu verwenden, erhalten Sie Fehler wie "Fehler: 'Path' ist nicht verfügbar: eingeführt in ..."
Zumindest zum Zeitpunkt des Schreibens richten sich die meisten Apple -Entwickler an die OSS, die älter sind, und müssen daher std :: filesystem zurückbackt. Diese Bibliothek ist nützlich, wenn Sie STD :: Dateisystem verwenden möchten und Ihren Code auf Apple -Plattformen funktionieren lassen :)
[Auf diese Weise können Sie auch STD :: Dateisystem in älteren C ++ - Versionen (C ++ 11) verwenden, aber das ist nicht die Hauptmotivation. Aktualisieren Sie einfach die neueste C ++ - Version!]
Wie löst das mein Problem?
Verwenden Sie einfach das Setup-Snippet unten, #include "backport/filesystem.hpp" und dann FS :: als Drop-In-Austausch für std :: fileSystem in Code, die möglicherweise auf Apple-Plattformen abzielen.
Unter der Motorhaube fallen wir in Binärdateien, die es brauchen, zu Gulrak/Dateisystem (nur) zurück. Gulrak/Dateisystem ist API-kompatibel mit STD :: Dateisystem, sodass Sie denselben modernen Code schreiben können, den Sie sonst tun würden. Sobald Std :: Dateisystem-Unterstützung allgegenwärtig ist, ist es einfach, diesen Shim auszuschalten. (Es war einmal, dass wir auf Boost :: Dateisystem zurückgegangen sind, aber es gab genügend Unterschiede in der API, um sehr ärgerlich zu sein, insbesondere zu Zeit, trotz des Boost :: Dateisystems, der Std :: Dateisystem inspiriert hat.)
Grundlegende Setup -Zeit: 2m
Grüß dich, Bazel -Benutzer? Lassen Sie uns in kürzester Zeit die STD :: Dateisystem -API verwenden.
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 std::filesystem Backport
# 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.
# https://github.com/hedronvision/bazel-cc-filesystem-backport
http_archive (
name = "hedron_std_filesystem_backport" ,
# 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-cc-filesystem-backport/archive/315416306204ce6bb2983b4a923815a7e89eb727.tar.gz" ,
strip_prefix = "bazel-cc-filesystem-backport-315416306204ce6bb2983b4a923815a7e89eb727" ,
# When you first run this tool, it'll recommend a sha256 hash to put here with a message like: "DEBUG: Rule 'hedron_std_filesystem_backport' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = ..."
)
load ( "@hedron_std_filesystem_backport//:workspace_setup.bzl" , "hedron_backport_std_filesystem" )
hedron_backport_std_filesystem () Fügen Sie Ihren deps "@hedron_std_filesystem_backport" hinzu und ...
# include " backport/filesystem.hpp "
fs::path p = ...Die API ist die gleiche wie STD :: Dateisystem, nur unter FS ::
Siehe https://en.cppreference.com/w/cpp/filesystem für API -Dokumente.
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 in der Lage zu sein, die STD :: Dateisystem -API in tragbarem Code einfach zu verwenden.
Wenn Sie Bazel für C ++ verwenden, möchten Sie wahrscheinlich auch einige unserer anderen Werkzeuge, wie ...