[RUBY] Ich möchte den Inhalt von Assets in der mit capistrano erstellten Umgebung von Grund auf neu erstellen

Warum wolltest du das tun?

EC2 hatte nicht genügend Arbeitsspeicher, während die Ressourcen von capistrano ausgeführt wurden: Die Vorkompilierung wurde ausgeführt, und als Ergebnis des Neustarts der Instanz wurde die Bereitstellung zur Hälfte beendet. Wenn der Webserver basierend auf dem halbfertigen Kompilierungsergebnis ausgeführt wird und ein Laufzeitfehler auftritt, kann ich ihn nicht sehen und habe versucht, ihn wieder in einen sauberen Zustand zu versetzen.

Versionsinformation

rails (5.2.4.2)
capistrano (3.11.0)
sprockets (3.7.2)
sprockets-rails (3.2.1)

Voraussetzungen

current_path ist dieser Pfad

shared_path sollte dieser Pfad sein

Fazit zuerst

Zusammenfassend ist dies, was Sie tun müssen.

  1. Löschen Sie den Inhalt von / var / www / app_name / shared / public / assets
  2. Löschen Sie den Inhalt von / var / www / app_name / shared / tmp / cache / assets
  3. Stellen Sie wie gewohnt bereit

Es gibt eine Einschränkung. capistrano wird standardmäßig mit Befehlen wie "deploy: clobber_assets" geliefert, die wahrscheinlich Assets löschen. Dies bedeutet, dass Sie es von Hand löschen können, ohne es zu verwenden. Der Grund wird später beschrieben.

Erläuterung

Verzeichnisstruktur von Capistrano

Erstens ist die Struktur innerhalb des / var / www / app_name des von capistrano bereitgestellten Servers wie folgt.

├── aktuell (symbolischer Link ist an das neueste Verzeichnis in Releases angehängt)
├── releases
│   ├── 20200601101105
│   ├── 20200601102714
│   └── 20200601105159
├── repo
├── revisions.log
└── shared

Unter dieser aktuellen, dh unter Releases / 2006001105159, wird sie wie im Repository Ihres Projekts konfiguriert. Es sollte app /, config / und public / geben.

Unter dieser öffentlichen / ist Assets / mit erstellten statischen Dateien gepackt ... so zu tun / var / www / app_name / current / public / assets ist eine symbolische Verknüpfung zu / var / www / app_name / shared / Assets.

Und / var / www / app_name / current / tmp / cache ist auch eine symbolische Verknüpfung zu / var / www / app_name / shared / tmp / cache.

Wie Assets: Cache vorkompilieren funktioniert

[Rails Guide Asset Cash Store](https://railsguides.jp/asset_pipeline.html#%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%81% AE% E3% 82% AD% E3% 83% A3% E3% 83% 83% E3% 82% B7% E3% 83% A5% E3% 82% B9% E3% 83% 88% E3% 82% A2)

Die Standard-Sprockets speichern Assets in Entwicklungs- und Produktionsumgebungen in tmp / cache / assets zwischen.

Während es geschrieben wird, gibt es einen Cache des Kompilierungsergebnisses in tmp / cache / assets. Löschen Sie ihn daher. Im Fall von capistrano entspricht / var / www / app_name / shared / tmp / cache / assets dem, also löschen Sie es.

Wie Sprockets Ergebnisse bereitstellen, wird zwischengespeichert

Abgesehen von den Assets: Comp vorkompilieren, speichert Sprockets auch die Bereitstellungsergebnisdatei. Der Code in Sprockets sagt ungefähr Folgendes:

module Sprockets
  module Exporters
    # Writes a an asset file to disk
    class FileExporter < Exporters::Base
      def skip?(logger)
        if ::File.exist?(target)
          logger.debug "Skipping #{ target }, already exists"
          true
        else
          logger.info "Writing #{ target }"
          false
        end
      end

      def call
        write(target) do |file|
          file.write(asset.source)
        end
      end
    end
  end
end

Haben Sie bei der Bereitstellung von: Assets: Precompile eine Reihe von Protokollen in der Standardausgabe gesehen? Es ist wahrscheinlich der obige Code, der das erkennt. Siehe logger.info" Schreiben.

So was:

      01 I, [2020-06-01T08:56:09.691790 #10361]  INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/develop/application-232387090aed00e6b038…
      01 I, [2020-06-01T08:56:09.692557 #10361]  INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/develop/application-232387090aed00e6b038…
      01 I, [2020-06-01T08:56:17.418572 #10361]  INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/lb-0002/application-d1bedc9937772b59211a…
      01 I, [2020-06-01T08:56:17.418856 #10361]  INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/lb-0002/application-d1bedc9937772b59211a…
      01 I, [2020-06-01T08:56:21.414096 #10361]  INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/lb-0003/application-5a60e0a26af1e40a9188…
      01 I, [2020-06-01T08:56:21.414368 #10361]  INFO -- : Writing /var/www/app_name/releases/20200601085319/public/assets/lb-0003/application-5a60e0a26af1e40a9188…

Wenn Sie in diesem "Überspringen?" Urteil stecken bleiben. Mit anderen Worten, wenn in diesem Beispiel die Datei mit dem Digest "/ var / www / app_name / release / 20200601085319 / public / assets / development / application-232387090aed00e6b038 ..." bereits vorhanden ist, Sprockets exportiert keine Dateien.

Wenn also bei capistrano dieselbe Datei in "/ var / www / app_name / shared / assets" vorhanden ist, wird sie von diesem Sprung übersprungen. Sie müssen es löschen.

Oh? Es scheint einen bequemen Befehl zu geben ...?

capistrano zeigt alle Befehle mit cap -T an. Sie können einen solchen Befehl in Bezug auf Assets finden.

cap deploy:cleanup_assets          # Cleanup expired assets
cap deploy:clobber_assets          # Clobber assets

Ist der Befehl deploy: clobber_assets nicht standardmäßig vorbereitet? Clobber bedeutet zu schlagen. Es scheint, dass sie Sie zwingen werden, neue Vermögenswerte zu machen! Das ist gut! Wenn Sie darüber nachdenken und es verwenden, wird es sich nicht wie erwartet verhalten.

$ bundle exec cap review deploy:clobber_assets

00:00 deploy:clobber_assets
      01 bundle exec rake assets:clobber
      01 I, [2020-06-01T11:22:46.062204 #6756]  INFO -- : Removed /var/www/app_name/releases/20200601094959/public/assets
      01 Removed webpack output path directory /var/www/app_name/releases/20200601094959/public/packs

Es scheint, dass die Assets zusammen mit dem Verzeichnis gelöscht werden. Wenn Sie jedoch genau hinschauen, handelt es sich bei den entfernten Assets nur um symbolische Links, und die wesentlichen Inhalte werden nicht gelöscht. "Ja wirklich?" Und erstens wird tmp / cache, der zur Kompilierungszeit der Cache ist, nicht gelöscht.

Es scheint, dass Problem auch darüber angesprochen wurde.

Wie ich in der "Schlussfolgerung" geschrieben habe, scheint es besser, den Befehl manuell auszuführen, um ihn zu löschen, oder den Befehl selbst zu definieren.

Recommended Posts

Ich möchte den Inhalt von Assets in der mit capistrano erstellten Umgebung von Grund auf neu erstellen
Ich möchte den Inhalt der Absicht var_dump
[Anfänger] Verfahren zum Anmelden bei der mit Vagrant erstellten virtuellen Umgebung
Ich habe versucht, mit Docker eine Plant UML Server-Umgebung zu erstellen
Ich möchte den Wert von Attribute in Selenium of Ruby ändern
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
Ich möchte mit der Berechtigung des Windows-Verzeichnisses von WSL (Ubuntu) herumspielen.
Immerhin wollte ich den Inhalt von MySQL mit Docker in der Vorschau anzeigen ...
Ich möchte den Wert in Ruby erhalten
Ich möchte den Inhalt der Anfrage sehen, ohne vier oder fünf zu sagen
[Java] Ich möchte die Differenz zum Datum berechnen
Ich möchte eine TraceId in das Protokoll einbetten
Tokoro habe ich in der Migration von Wicket 7 auf 8 umgeschrieben
Ich möchte die Antwort der Janken-App wissen
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich möchte den Dunkelmodus mit der SWT-App verwenden
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Für diejenigen, die MySQL für die Datenbank in der Umgebungskonstruktion von Rails6 ~ verwenden möchten.
Ich möchte den Pfad nach der neuen Registrierung ändern, nachdem ich mich mit mehreren Geräten angemeldet habe.
Verwendung von git mit der Leistung von jgit in einer Umgebung ohne git-Befehle
[Rails] Ich möchte das Linkziel von link_to auf einer separaten Registerkarte anzeigen
Auch wenn ich den Inhalt eines Datenobjekts in Java in JSON konvertieren möchte, gibt es einen Zirkelverweis ...
In Java möchte ich mehrere angegebene Zeichen nur von Anfang bis Ende abschneiden.
Nachdem ich einen Artikel mit Rails Simple Calendar veröffentlicht habe, möchte ich ihn im Kalender wiedergeben.
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
So verwalten Sie den Unterschied in jeder Umgebung mit yml, ohne die Anzahl von RAILS_ENV zu erhöhen
Ich möchte eine Liste des Inhalts einer Zip-Datei und ihrer unkomprimierten Größe erhalten
Ich möchte die Farbe des Steuerungsmenüs oben in Liferay 7 / DXP ändern
Ich habe versucht, Docker zu verwenden, weil ich die lokale Umgebung bei der Entwicklung der Registerkarte "Microsoft Teams" von MS Learn nicht verschmutzen möchte
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe versucht, die Cache-Funktion von Application Container Cloud Service in der lokalen Umgebung zu entwickeln
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
[Ruby] Ich möchte die Reihenfolge der Hash-Tabelle umkehren
Ich möchte den Startbefehl mit Docker-Compose an Postgres übergeben.
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
[Controller] Ich möchte den numerischen Wert einer bestimmten Spalte aus der Datenbank abrufen (mein Memo).
Ich möchte die Methode des Controllers kennen, bei der die Ausnahme im ExceptionHandler von Spring Boot ausgelöst wurde
Ich habe versucht, das Problem der "mehrstufigen Auswahl" mit Ruby zu lösen
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!