From 79e87b0bb9dbd4d8c0fcea3fee592533066ee997 Mon Sep 17 00:00:00 2001 From: Jonas Franz Date: Wed, 13 Jun 2018 15:27:04 +0200 Subject: [PATCH] Pack frontend into binary Improved webpack Signed-off-by: Jonas Franz --- .drone.yml | 11 +++- .gitignore | 1 + Gopkg.lock | 14 ++++- Gopkg.toml | 4 ++ api/fs.go | 18 ++++++ api/router.go | 5 +- frontend/index.html | 18 ------ frontend/package.json | 2 + frontend/src/index.html | 7 --- frontend/webpack.config.js | 125 ++++++++++++++++++++----------------- frontend/yarn.lock | 78 ++++++++++++++++++++++- 11 files changed, 197 insertions(+), 86 deletions(-) create mode 100644 api/fs.go delete mode 100644 frontend/index.html diff --git a/.drone.yml b/.drone.yml index 5a4752b..c5d1183 100644 --- a/.drone.yml +++ b/.drone.yml @@ -28,7 +28,7 @@ pipeline: commands: - cd frontend/ - yarn build - deps: + build: image: golang:1.10 pull: true environment: @@ -36,6 +36,8 @@ pipeline: commands: - go get -u github.com/golang/dep/cmd/dep - dep ensure + - go get -u github.com/gobuffalo/packr/... + - packr -z test: image: golang:1.10 pull: true @@ -56,6 +58,13 @@ pipeline: - xgo -out gitea-github-migrator -ldflags "-X main.version=${DRONE_TAG##v} -X main.build=${DRONE_BUILD_NUMBER}" --targets=windows/*,darwin/*,linux/* . when: event: [ tag ] + clean: + image: golang:1.10 + pull: true + environment: + GOPATH: /go + commands: + - packr clean gitea: image: plugins/gitea-release:latest pull: true diff --git a/.gitignore b/.gitignore index 7560965..81ca976 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ # Output of the go coverage tool, specifically when used with LiteIDE *.out +*-packr.go # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 .glide/ diff --git a/Gopkg.lock b/Gopkg.lock index 26c9dcb..34e918e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -35,6 +35,12 @@ revision = "d459835d2b077e44f7c9b453505ee29881d5d12d" version = "v1.2" +[[projects]] + name = "github.com/gobuffalo/packr" + packages = ["."] + revision = "bd47f2894846e32edcf9aa37290fef76c327883f" + version = "v1.11.1" + [[projects]] name = "github.com/golang/protobuf" packages = ["proto"] @@ -65,6 +71,12 @@ revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" version = "v0.0.3" +[[projects]] + name = "github.com/pkg/errors" + packages = ["."] + revision = "645ef00459ed84a119197bfb8d8205042c6df63d" + version = "v0.8.0" + [[projects]] name = "github.com/ugorji/go" packages = ["codec"] @@ -131,6 +143,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "2884c43b72546db916785490241c84920a25e0f43df532f9b3a551a678e3cc42" + inputs-digest = "4a75dbc846a83d2e7c1a0d840da062e06835663a2a4a60225d41ee22a89db840" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 81c5650..175e8b2 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -51,3 +51,7 @@ [[constraint]] branch = "master" name = "github.com/jinzhu/configor" + +[[constraint]] + name = "github.com/gobuffalo/packr" + version = "1.11.1" diff --git a/api/fs.go b/api/fs.go new file mode 100644 index 0000000..ff7b5e4 --- /dev/null +++ b/api/fs.go @@ -0,0 +1,18 @@ +package api + +import ( + "strings" + + "github.com/gobuffalo/packr" +) + +type BundledFS struct { + packr.Box +} + +func (fs *BundledFS) Exists(prefix string, filepath string) bool { + if p := strings.TrimPrefix(filepath, prefix); len(p) < len(filepath) { + return fs.Has(p) + } + return false +} diff --git a/api/router.go b/api/router.go index 23ee7f1..4dbb1bb 100644 --- a/api/router.go +++ b/api/router.go @@ -22,12 +22,15 @@ import ( "git.jonasfranz.software/JonasFranzDEV/gitea-github-migrator/api/auth" "github.com/gin-gonic/contrib/static" "github.com/gin-gonic/gin" + "github.com/gobuffalo/packr" ) func InitRoutes() *gin.Engine { r := gin.Default() auth.InitOAuthConfig() - r.Use(static.Serve("/", static.LocalFile("./frontend", true))) + + box := packr.NewBox("../frontend/dist/") + r.Use(static.Serve("/", &BundledFS{box})) api := r.Group("/api") { au := api.Group("/auth") diff --git a/frontend/index.html b/frontend/index.html deleted file mode 100644 index b876827..0000000 --- a/frontend/index.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - Gitea Migrator - - - -
- - - - - - - - - \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index e654a7f..52cc954 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,7 +23,9 @@ "babel-loader": "^7.1.4", "babel-preset-env": "^1.7.0", "babel-preset-react": "^6.24.1", + "copy-webpack-plugin": "^4.5.1", "html-loader": "^0.5.5", + "html-webpack-externals-plugin": "^3.8.0", "html-webpack-plugin": "^3.2.0", "husky": "^0.14.3", "prettier": "1.13.5", diff --git a/frontend/src/index.html b/frontend/src/index.html index 99eda79..3f20513 100644 --- a/frontend/src/index.html +++ b/frontend/src/index.html @@ -7,12 +7,5 @@
- - - - - - - \ No newline at end of file diff --git a/frontend/webpack.config.js b/frontend/webpack.config.js index 4414c01..5073ce8 100644 --- a/frontend/webpack.config.js +++ b/frontend/webpack.config.js @@ -1,65 +1,76 @@ var HtmlWebPackPlugin = require("html-webpack-plugin"); +var CopyWebpackPlugin = require("copy-webpack-plugin"); +var HtmlWebpackExternalsPlugin = require("html-webpack-externals-plugin"); module.exports = { - entry: "./src/index.tsx", - output: { - filename: "bundle.js", - path: __dirname + "/dist" - }, + entry: "./src/index.tsx", + output: { + filename: "bundle.js", + path: __dirname + "/dist" + }, - // Enable sourcemaps for debugging webpack's output. - devtool: "source-map", - mode: "development", + // Enable sourcemaps for debugging webpack's output. + devtool: "source-map", + mode: "development", - resolve: { - // Add '.ts' and '.tsx' as resolvable extensions. - extensions: [".ts", ".tsx", ".js", ".json"] - }, - - module: { - rules: [ - // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'. - { test: /\.tsx?$/, use: [ - { - loader: 'babel-loader', - options: { - babelrc: false, - plugins: ['react-hot-loader/babel'] - } - }, - 'awesome-typescript-loader' - ] - }, - - { - test: /\.html$/, - use: [ - { - loader: 'html-loader' - } - ] - }, - // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'. - { enforce: "pre", test: /\.js$/, loader: "source-map-loader" } + resolve: { + // Add '.ts' and '.tsx' as resolvable extensions. + extensions: [".ts", ".tsx", ".js", ".json"] + }, + module: { + rules: [ + // All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'. + { + test: /\.tsx?$/, + use: [ + { + loader: "babel-loader", + options: { + babelrc: false, + plugins: ["react-hot-loader/babel"] + } + }, + "awesome-typescript-loader" ] - }, + }, - plugins: [ - new HtmlWebPackPlugin( - { - template: "./src/index.html", - filename: "./index.html" - } - ) - ], + { + test: /\.html$/, + use: [ + { + loader: "html-loader" + } + ] + }, + // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'. + { enforce: "pre", test: /\.js$/, loader: "source-map-loader" } + ] + }, - // When importing a module whose path matches one of the following, just - // assume a corresponding global variable exists and use that instead. - // This is important because it allows us to avoid bundling all of our - // dependencies, which allows browsers to cache those libraries between builds. - externals: { - "react": "React", - "react-dom": "ReactDOM", - "semantic-ui-react": "semanticUIReact" - } -}; \ No newline at end of file + plugins: [ + new HtmlWebPackPlugin({ + template: "./src/index.html", + filename: "./index.html" + }), + new HtmlWebpackExternalsPlugin({ + externals: [ + { + module: "react", + entry: "umd/react.development.js", + global: "React" + }, + { + module: "react-dom", + entry: "umd/react-dom.development.js", + global: "ReactDOM" + }, + { + module: "semantic-ui-react", + entry: "dist/umd/semantic-ui-react.min.js", + global: "semanticUIReact" + } + ] + }), + new CopyWebpackPlugin([{ from: "assets", to: "assets" }]) + ] +}; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 35282fc..1aa15ba 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -214,6 +214,15 @@ ajv@^6.1.0: json-schema-traverse "^0.3.0" uri-js "^4.2.1" +ajv@^6.1.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.1.tgz#88ebc1263c7133937d108b80c5572e64e1d9322d" + dependencies: + fast-deep-equal "^2.0.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.1" + ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" @@ -309,6 +318,10 @@ array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -1361,6 +1374,19 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" +copy-webpack-plugin@^4.4.1, copy-webpack-plugin@^4.5.1: + version "4.5.1" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz#fc4f68f4add837cc5e13d111b20715793225d29c" + dependencies: + cacache "^10.0.4" + find-cache-dir "^1.0.0" + globby "^7.1.1" + is-glob "^4.0.0" + loader-utils "^1.1.0" + minimatch "^3.0.4" + p-limit "^1.0.0" + serialize-javascript "^1.4.0" + core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" @@ -1586,6 +1612,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -2171,6 +2204,17 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -2316,6 +2360,22 @@ html-minifier@^3.2.3, html-minifier@^3.5.8: relateurl "0.2.x" uglify-js "3.3.x" +html-webpack-externals-plugin@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/html-webpack-externals-plugin/-/html-webpack-externals-plugin-3.8.0.tgz#e3f38419c67b7599e69afab0966a2164d2a3d838" + dependencies: + ajv "^6.1.1" + copy-webpack-plugin "^4.4.1" + html-webpack-include-assets-plugin "^1.0.2" + +html-webpack-include-assets-plugin@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/html-webpack-include-assets-plugin/-/html-webpack-include-assets-plugin-1.0.4.tgz#279cfdf001301f5a945b2525f7f6394d48a3a157" + dependencies: + glob "^7.1.2" + minimatch "^3.0.4" + slash "^1.0.0" + html-webpack-plugin@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b" @@ -2416,7 +2476,7 @@ ignore-walk@^3.0.1: dependencies: minimatch "^3.0.4" -ignore@^3.3.7: +ignore@^3.3.5, ignore@^3.3.7: version "3.3.8" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.8.tgz#3f8e9c35d38708a3a7e0e9abb6c73e7ee7707b2b" @@ -2746,6 +2806,10 @@ json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" @@ -3384,6 +3448,12 @@ p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" +p-limit@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" @@ -3498,6 +3568,12 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + pbkdf2@^3.0.3: version "3.0.16" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"