2016-04-27 9 views
8

Ich verwende node.js (Express) auf Heroku, wo die slug size is limited to 300MB.Serve git-lfs Dateien aus Express 'Öffentlichen Ordner

Um meine Slug klein zu halten, möchte ich git-lfs verwenden, um meinen Express 'public Ordner zu verfolgen.

Auf diese Weise werden alle meine Assets (Bilder, Videos ...) in einen lfs-Store (sagen wir AWS S3) hochgeladen und git-lfs verlässt a pointer file (mit wahrscheinlich der S3 URL darin?).

Ich möchte Express-Weiterleitungen an die Remote-S3-Datei beim Versenden von Dateien aus dem Öffentlichen Ordner.

Mein Problem ist, ich Kwon nicht, wie die URL aus der Zeigerdatei Inhalt abrufen ...

app.use('/public/:pointerfile', function (req, res, next) { 
    var file = req.params.pointerfile; 
    fs.readFile('public/'+file, function (er, data) { 
    if (er) return next(er); 

    var url = retrieveUrl(data); // <-- HELP ME HERE with the retrieveUrl function 

    res.redirect(url); 
    }); 
}); 

Glauben Sie nicht, es wird nicht zu teuer sein Expresslese- zu machen und analysieren möglicherweise alle public/* Dateien. Vielleicht könnte ich die URL nach dem Parsen zwischenspeichern?

Antwort

10

Tatsächlich ist die pointer Datei enthält keine URL-Informationen in ihm (wie Sie zur Verfügung gestellt, oder here in dem Link zu sehen) - es hält nur die oid (Objekt-ID) für den Blob, das seine gerade sha256 ist.

Sie können jedoch erreichen, was Sie die oid und der AKE für die Verwendung von api suchen, die Sie bestimmte oid s mit dem batch request herunterladen können.

Sie können sagen, was der Endpunkt ist, die von .git/config speichern Sie Ihre Blobs verwendet wird, die Nicht-Standard-lfsurl Tags wie akzeptieren können:

[remote "origin"] 
    url = https://... 
    fetch = +refs/heads/*:refs/remotes/origin/* 
    lfsurl = "https://..." 

oder einem separaten

[lfs] 
    url = "https://..." 

Wenn nein, es gibt lfsurl Tag, dann verwenden Sie den Endpunkt von GitHub (der wiederum zu S3 umleiten kann):

Git remote: https://git-server.com/user/repo.git 
Git LFS endpoint: https://git-server.com/user/repo.git/info/lfs 

Git remote: [email protected]:user/repo.git 
Git LFS endpoint: https://git-server.com/user/repo.git/info/lfs 

Aber Sie sollten dagegen arbeiten und nicht direkt S3, da GitHubs Redirect-Antwort wahrscheinlich auch einige Authentifizierungsinformationen enthalten wird.

Überprüfen Sie die batch response doc die Antwortstruktur zu sehen - Sie werden im Grunde die relevanten Teile analysieren müssen und Ihren eigenen Anruf die Blobs abzurufen (was, was git lfs hätte an deiner Stelle bei der Kasse erfolgt ist).

Eine typische Antwort (vom doc genommen, die ich verweisen) würde in etwa so aussehen:

{ 
    "_links": { 
    "download": { 
     "href": "https://storage-server.com/OID", 
     "header": { 
     "Authorization": "Basic ...", 
     } 
    } 
    } 
} 

So würden Sie GEThttps://storage-server.com/OID mit dem, was headers aus der Batch-Antwort zurückgegeben wurde - der letzte Schritt der umbenennen werden Blob, der zurückgegeben wurde (sein Name ist in der Regel nur die oid als git lfs verwendet Checksum-basierten Speicher) - die Zeiger-Datei hat den ursprünglichen Namen der Ressource, also benennen Sie den Blob nur um.

+0

thx @fundeldman, könnten Sie ein bisschen mehr über die Anfrage entwickeln, um die Ressource URL greifen zu machen mit die Batch-API (ohne GitHub und Autorisierung)? Danke vielmals – abernier