Skip to content

Commit 2a4ff6f

Browse files
committed
Implemented custom asset versioning to make creating releases easier
1 parent f4b342a commit 2a4ff6f

5 files changed

Lines changed: 57 additions & 6 deletions

File tree

app/helpers.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
if (! function_exists('versioned_asset')) {
4+
/**
5+
* Get the path to a versioned file.
6+
*
7+
* @param string $file
8+
* @return string
9+
*
10+
* @throws \InvalidArgumentException
11+
*/
12+
function versioned_asset($file)
13+
{
14+
static $manifest = null;
15+
16+
if (is_null($manifest)) {
17+
$manifest = json_decode(file_get_contents(public_path('build/manifest.json')), true);
18+
}
19+
20+
if (isset($manifest[$file])) {
21+
return '/' . $manifest[$file];
22+
}
23+
24+
if (file_exists(public_path($file))) {
25+
return '/' . $file;
26+
}
27+
28+
throw new InvalidArgumentException("File {$file} not defined in asset manifest.");
29+
}
30+
}

composer.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,10 @@
2525
],
2626
"psr-4": {
2727
"BookStack\\": "app/"
28-
}
28+
},
29+
"files": [
30+
"app/helpers.php"
31+
]
2932
},
3033
"autoload-dev": {
3134
"classmap": [

gulpfile.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,26 @@
11
var elixir = require('laravel-elixir');
22

3+
// Custom extensions
4+
var gulp = require('gulp');
5+
var Task = elixir.Task;
6+
var fs = require('fs');
7+
8+
elixir.extend('queryVersion', function(inputFiles) {
9+
new Task('queryVersion', function() {
10+
var manifestObject = {};
11+
var uidString = Date.now().toString(16).slice(4);
12+
for (var i = 0; i < inputFiles.length; i++) {
13+
var file = inputFiles[i];
14+
manifestObject[file] = file + '?version=' + uidString;
15+
}
16+
var fileContents = JSON.stringify(manifestObject, null, 1);
17+
fs.writeFileSync('public/build/manifest.json', fileContents);
18+
}).watch(['./public/css/*.css', './public/js/*.js']);
19+
});
20+
321
elixir(function(mix) {
422
mix.sass('styles.scss')
523
.sass('print-styles.scss')
624
.browserify(['jquery-extensions.js', 'global.js'], 'public/js/common.js')
7-
.version(['css/styles.css', 'css/print-styles.css', 'js/common.js']);
25+
.queryVersion(['css/styles.css', 'css/print-styles.css', 'js/common.js']);
826
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"private": true,
33
"devDependencies": {
4-
"gulp": "^3.8.8",
4+
"gulp": "^3.9.0",
55
"insert-css": "^0.2.0"
66
},
77
"dependencies": {

resources/views/base.blade.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
<meta charset="utf-8">
1010

1111
<!-- Styles and Fonts -->
12-
<link rel="stylesheet" href="{{ elixir('css/styles.css') }}">
13-
<link rel="stylesheet" media="print" href="{{ elixir('css/print-styles.css') }}">
12+
<link rel="stylesheet" href="{{ versioned_asset('css/styles.css') }}">
13+
<link rel="stylesheet" media="print" href="{{ versioned_asset('css/print-styles.css') }}">
1414
<link href='//fonts.googleapis.com/css?family=Roboto:400,400italic,500,500italic,700,700italic,300italic,100,300' rel='stylesheet' type='text/css'>
1515
<link rel="stylesheet" href="/libs/material-design-iconic-font/css/material-design-iconic-font.min.css">
1616

@@ -79,6 +79,6 @@
7979
</section>
8080

8181
@yield('bottom')
82-
<script src="{{ elixir('js/common.js') }}"></script>
82+
<script src="{{ versioned_asset('js/common.js') }}"></script>
8383
</body>
8484
</html>

0 commit comments

Comments
 (0)