Revision cf96c588
Von Moritz Bunkus vor etwa 4 Jahren hinzugefügt
SL/Layout/Base.pm | ||
---|---|---|
3 | 3 |
use strict; |
4 | 4 |
use parent qw(Rose::Object); |
5 | 5 |
|
6 |
use File::Slurp qw(read_file); |
|
6 | 7 |
use List::MoreUtils qw(uniq); |
7 | 8 |
use Time::HiRes qw(); |
8 | 9 |
|
... | ... | |
19 | 20 |
|
20 | 21 |
use SL::Menu; |
21 | 22 |
use SL::Presenter; |
23 |
use SL::System::Process; |
|
22 | 24 |
|
23 | 25 |
my %menu_cache; |
24 | 26 |
|
... | ... | |
42 | 44 |
} |
43 | 45 |
|
44 | 46 |
sub init_auto_reload_resources_param { |
45 |
return '' unless $::lx_office_conf{debug}->{auto_reload_resources}; |
|
46 |
return sprintf('?rand=%d-%d-%d', Time::HiRes::gettimeofday(), int(rand 1000000000000)); |
|
47 |
return sprintf('?rand=%d-%d-%d', Time::HiRes::gettimeofday(), int(rand 1000000000000)) if $::lx_office_conf{debug}->{auto_reload_resources}; |
|
48 |
|
|
49 |
my $git_dir = SL::System::Process::exe_dir() . '/.git'; |
|
50 |
|
|
51 |
return '' unless -d $git_dir; |
|
52 |
|
|
53 |
my $content = eval { scalar(read_file($git_dir . '/HEAD')) }; |
|
54 |
|
|
55 |
return '' unless ($content // '') =~ m{\Aref: ([^\r\n]+)}; |
|
56 |
|
|
57 |
$content = eval { scalar(read_file($git_dir . '/' . $1)) }; |
|
58 |
|
|
59 |
return '' unless ($content // '') =~ m{\A([0-9a-fA-F]+)}; |
|
60 |
|
|
61 |
return '?rand=' . $1; |
|
47 | 62 |
} |
48 | 63 |
|
49 | 64 |
########################################## |
Auch abrufbar als: Unified diff
CSS/JS: Git-Revision von HEAD als GET-Parameter verwenden
Webbrowser cachen CSS & JS sehr aggressiv. Das ist während der
Entwicklung störend, weshalb es bereits seit langem die
Konfigurationsoption `auto_reload_resources` gibt. Ist diese an, so
wird an alle CSS- und JS-URLs ein GET-Parameter `?rand=<Zufallswert>`
angehängt wird, um das Cachen auszuhebeln.
Dieser Commit führt etwas Ähnliches ein, das für den Produktivbetrieb
ohne `auto_reload_resources` gedacht ist. Wenn kivitendo erkennt, dass
es aus git heraus läuft (also ein `.git`-Verzeichnis existiert), so
parset es die Revision von `HEAD` und nimmt das als GET-Parameter
`?rand=<Revision>`. Der Vorteil ist, dass nach Updates einer
Produktivinstallation die Webbrowser der Anwender*innen genau einmal
alle Ressourcen neu laden, weil sich ja die Git-Revisionsnummer
geändert hat. Anschließend können sie die Ressourcen aber wieder
normal cachen, bis das nächste Update kommt.
Es wird hierfür übrigens kein installiertes git-Executable benötigt;
die Infos werden zwecks Performance direkt aus den Dateien gelesen,
anstatt bei jedem Request ein Programm auszuführen.
Zukünftig könnte man ein analoges Verfahren anwenden, wenn es kein
`.git`-Verzeichnis gibt, und dann zumindest die
kivitendo-Versionsnummer verwenden.