Websync ist wie aws s3 sync
mit automatischer CloudFront-Invalidierung und mehr.
Die Websync-Synchronisierung soll ein Ersatz für aws s3 sync
sein. Websync synchronisiert wie die AWS-CLI lokale Verzeichnisse mit S3-Präfixen und umgekehrt. Websync erweitert diese Funktionen, indem es automatisch optimierte Invalidierungen für alle zugehörigen CloudFront-Distributionen erstellt und ein ausdrucksstarkes Konfigurationssystem (zusätzlich zur CLI-Schnittstelle) mit JSON oder JavaScript sowie eine programmgesteuerte API bereitstellt.
# Install global cli, the `websync` command
npm i -g websync
# Install local
npm i websync
# Parse configuration from `websync.json` or `websync.js`
websync
# Parse configuration explicitly
websync --config ./myConfig.js
# With command line options
websync ./www s3://mybucket.io
# General
websync [source] [target] [...options]
source
Quellcontainer (lokales Verzeichnis oder S3-Bucket): ./myDirectory
target
Zielcontainer (S3-Bucket oder lokales Verzeichnis): s3://my-bucket
config
Explizite Konfigurationsdatei (JSON oder JavaScript): --config ./myConfig.json
include
Glob-Muster zum Filtern von Dateien (aus der Quelle), um Folgendes einzuschließen: --include **/*.ext
exclude
, um auszuschließende Dateien (aus der Quelle) zu filtern: --exclude **/*.ext
diffBy
Überschreiben Sie die Eigenschaft, nach der Elemente unterschieden werden ( modtime
oder size
mit Standardwert: modtime
): --diffBy size
wildcardPolicy
Überschreiben Sie die Wildcard-Richtlinie ( majority
, unanimous
oder minority
mit Standardeinstellung: majority
): --wildcardPolicy unanimous
wildcardAll
Platzhalter an alle Invalidierungspfade anhängen (HINWEIS: Dies ändert nicht die Auflösung des Invalidierungspfads), nützlich für die Invalidierung von Abfragezeichenfolgenpfaden: --wildcardAll
invalidateDeletes
Macht Pfade für Elemente ungültig, die aus dem Ziel gelöscht werden. Nützlich für Situationen, in denen Sie nicht möchten, dass Benutzer mehr auf die Elemente zugreifen können: --invalidateDeletes
distribution
Eine oder mehrere CloudFront-Verteilungs-IDs (HINWEIS: Dies überschreibt die Erkennung von Verteilungen): --distribution <DIST ID> --distribution <ANOTHER DIST ID>
yes
Überspringen Sie alle Eingabeaufforderungen mit einer „Ja“-Antwort (HINWEIS: Websync warnt Sie, wenn mehr als 500 Ungültigmachungen vorgenommen werden, da hierfür eine Zahlung erforderlich ist): --yes
HINWEIS : Weitere Optionen sind in den Konfigurationsdateien verfügbar
HINWEIS : Alle Befehlszeilenargumente ÜBERSCHREITEN die Optionen der Konfigurationsdatei. Darüber hinaus sind source
und target
erforderlich , können jedoch über die CLI oder die Konfigurationsdatei bereitgestellt werden
Konfigurationsdateien können alle über die CLI verfügbaren Optionen mit dem Zusatz von modifiers
bereitstellen, einem flexiblen System zur Bereitstellung expliziter Argumente für S3-Put-Vorgänge.
Das Modifikatorobjekt der Konfigurationsdatei ist ein Objekt, in dem die keys
Glob-Muster sind und die values
S3.putObject Params
sind, oder eine Funktion, die entweder ein S3.putObject Params
zurückgibt, oder ein Promise, das S3.putObject Params
auflöst. Beachten Sie: Wenn eine Funktion bereitgestellt wird (asynchron oder nicht), wird sie mit einem einzelnen Item
-Argument aufgerufen, das die Datei oder das Objekt aus dem SOURCE -Container darstellt. HINWEIS : Quelldateien können mit mehreren Modifikatoren übereinstimmen, sodass alles trocken bleibt.
JavaScript-Konfiguration. Den Kontext finden Sie im Beispiel.
const Path = require ( 'path' )
const DOWNLOAD_CONTENT_TYPE = 'application/octet-stream'
const DOWNLOAD_TAG = 'Downloadable'
const REDIRECT_TAG = 'Redirectable'
const makeDispositionName = fileName =>
` ${ Path . basename ( fileName ) . split ( '.' ) [ 0 ] } - ${ Date . now ( ) } ${ Path . extname ( fileName ) } `
module . exports = {
source : './public' ,
target : 's3://websync-complex-example-bucket' ,
modifiers : {
// This matches all files, provides Plain Object
'**/*' : {
Metadata : {
'source-user' : process . env . USER ,
} ,
} ,
// Matches all files in downloads, provides a synchronous function
'downloads/**/*' : item => ( {
ContentType : DOWNLOAD_CONTENT_TYPE ,
ContentDisposition : `attachment; filename=" ${ makeDispositionName ( item . key ) } "` ,
Tagging : DOWNLOAD_TAG ,
} ) ,
// Matches any file with the `.redirect` extension, provides an asynchronous funcion
'*.redirect' : async item => ( {
WebsiteRedirectLocation : ( await item . read ( ) ) . toString ( ) . trim ( ) ,
ContentType : 'text/html' ,
Tagging : REDIRECT_TAG ,
} ) ,
} ,
}
JSON-Konfiguration. Den Kontext finden Sie im Beispiel. Im folgenden Beispiel entspricht das !*.*
-Muster jedem Element ohne Erweiterung , z. B. „another-page“, und überschreibt den impliziten Content-Type
mit text/html
um saubere Pfade für eine einfache statische Website zu erhalten.
{
"source" : " ./public " ,
"target" : " s3://websync-basic-example-bucket " ,
"exclude" : " *.exclude " ,
"modifiers" : {
"!*.*" : {
"ContentType" : " text/html "
}
}
}
Item
Objekt von Websync ist eine Schnittstelle, die abstrakt entweder eine lokale Datei oder ein S3
Objekt darstellt. In Bezug auf die Configuration File
stammt das an eine modifier
übergebene Item
Objekt immer aus dem Quellcontainer (lokales Verzeichnis oder S3
Bucket). Alle Item
folgen der folgenden Schnittstelle:
interface Item {
// The "key" (path or S3 Object key)
key : string
// Last modification time
modtime : Date
// Size in bytes of the Item
size : number
// Whether item is a symbolic link (always false for S3)
isSymbolicLink : boolean
// Read the *entire* body of the item
read ( ) : Promise < Buffer >
}
Das Invalidierungssystem von Websync erstellt automatisch die minimale Anzahl an Invalidierungspfaden, die erforderlich sind, um die bereitgestellte wildcard
zu berücksichtigen. Dazu werden ein diff
zwischen target und source
sowie zwei Bäume erstellt: eines der Elemente im diff
und alle Elemente im target
. Anschließend durchläuft es den diff
Baum (beginnend bei der Wurzel) und vergleicht die Anzahl der untergeordneten Elemente, die ungültig gemacht werden, mit denen, die nicht ungültig gemacht werden – hier macht die wildcard
-Richtlinie den entscheidenden Unterschied. Darüber hinaus erkennt Websync, wann ein bestimmter Pfad, der mit einem Platzhalter versehen wird, alle seine untergeordneten Elemente oder nur seine direkten untergeordneten Elemente ungültig machen sollte, wodurch die optimalsten Invalidierungspfade erstellt werden.
HINWEIS : Die Option wildcardAll
ändert NICHT die Generierung des Invalidierungspfads, vielmehr werden Platzhalter an jeden generierten Pfad angehängt. Dies ist nützlich, um Abfragezeichenfolgenpfade für ein bestimmtes Objekt usw. ungültig zu machen.
Weitere Informationen zur Funktionsweise von Invalidierungen auf CloudFront finden Sie in der AWS-Dokumentation.
Wildcard-Richtlinien bestimmen, wann ein bestimmter Pfad mit Wildcards versehen wird, wodurch alle oder nur seine direkten untergeordneten Pfade ungültig gemacht werden, um die Anzahl der generierten Invalidierungspfade zu reduzieren. Die drei verfügbaren Richtlinien von der geringsten bis zur höchsten Strenge umfassen minority
, majority
und unanimous
.
Ein bestimmter Pfad wird mit einem Platzhalter versehen, wenn eine Minderheit seiner untergeordneten Pfade ungültig gemacht wird. HINWEIS : Dies führt immer zum Invalidierungspfad /*
, wenn Invalidierungen erforderlich sind.
Alle Zielelemente:
/
/css
main.css
vendor.css
/js
main.js
index.html
Ungültige Artikel:
/
index.html
Invalidierungspfade:
/*
Ein bestimmter Pfad wird mit einem Platzhalter versehen, wenn die Mehrheit seiner untergeordneten Pfade ungültig gemacht wird.
Alle Zielelemente:
/
/css
main.css
vendor.css
/js
main.js
index.html
Ungültige Artikel:
/
/css
main.css
vendor.css
index.html
Invalidierungspfade:
/css/*
/index.html
Ein bestimmter Pfad wird mit einem Platzhalter versehen, wenn alle seine untergeordneten Pfade ungültig gemacht werden.
Alle Zielelemente:
/
/css
main.css
vendor.css
/js
main.js
index.html
Ungültige Artikel:
/
/css
main.css
/js
/main.js
index.html
Invalidierungspfade:
/css/main.css
/js/*
/index.html