High Five
HTML5 build/deploy tool, usually used with PhoneGap but also for standalone web-based apps.
Installation
Add gem 'high_five'
to your Gemfile
or run gem install high_five
.
After installing the high_five gem, run
$ hi5 init
This will bootstrap your project, creating a config
directory if one isn't present and a few important files inside:
The most most important file. It is the main configuration file and where most configuration takes place. See below for configuration options. It contains sensible defaults.
config/high_five/app-common.js
This is where your shared javascript goes.
If you are using a framework like Sencha, this is where you would include the Sencha files.
At a minimum, you will likely include the main entry point for your app here.
This file is processed with Sprockets, so anything included here will be minified.
Do not add library or remote scripts here. Those should be added with config/high_five.rb
(see below for how to do this).
config/high_five/app-platform.js
This file is a template and must be copied to create app-<platform>.js
for each platform you have which by default are 'ios' and 'android'.
After creating app-<platform>.js
for each of your platforms, you can delete this file.
config/high_five/index.html.erb
The entry page for your app.
Configuration
TODO What does this do? Probably sets some values in some places
TODO What does this do? Probably sets some values in some places
Defaults to File.join(File.dirname(__FILE__), '..')
which should be the top-level directory of your app.
This is to where high five deploys your app which is set to www
by default.
If you are using high five with a cordova app, this will need to be set for iOS and Android separately (uncomment the appropriate lines in the platforms section of the config).
Use this if you're on windows and having problems with a strange ExecJS RuntimeError.
If set, high five will run compass compile
in the given directory before doing anything else.
This makes it possible, for example, to write sass in resources/sass/app.sass
and have it compiled to resources/css/app.css
which can then be included into your app with the stylesheets
method (see below).
NB: Make sure you have specified your compass config in config.rb
in this directory!
TODO Write some words about how minifying works and what you might need installed based on the variations options for minifying.
Generate app cache manifest.
This is usually specified in the :web
platform, and the manifest file is only created when the environment is production
.
You'll only use this if you're developing a javascript web app (e.g. an ember or angular app).
Copy generated index.html to given value, index-debug.html by default. The copied file will reference your source files and not the compiled files so that you do not need to deploy between every since code change. You'll only need to deploy when you add/remove a source file.
Bundling assets into your app
The important high five config options for assets are assets
, javascripts
, and stylesheets
.
This method takes either a directory or file name. When you deploy, those directories/files are copied into config.destination
.
For example, to include images into your app, first create resources/images
.
Then in the config file, add config.assets "resources/images"
. When you deploy it will create <destination>/resources/images
containing all of your images.
You can now reference your images with respect to the <destination>
directory. So a link to an image in your app would look like resources/images/foobar.png
.
To include a javascript file or stylesheet, use the javascripts
or stylesheets
method respectively.
This will add that file to <destination>/index.html
when deploying.
See config/high_five/index.html.erb
to see how this is done.
For example, let's say we want to include moment.js.
First we save the minified[1] file somewhere, resources/vendor/javascripts
, for example.
Then we add config.javascripts "resources/vendor/javascripts/moment.min.js"
to our config file.
When we deploy, that file will be included in <destination>/index.html
!
The same is true for stylesheets.
Don't forget that the file you give to the javascripts
and stylesheets
methods can be anything.
That means if you want to manage dependencies with npm, for example, you can do config.javascripts "node_modules/foo/bar.js"
!
[1] NB: hi5 does not minify your assets! Make sure you use the minified versions of your assets.
Advanced example
Let's say we want to add FontAwesome to our mobile app.
First, we extract the FontAwesome toolkit to resources/vendor/font-awesome-4.5.0
, deleting everything except the css and fonts directories.
Then we have high five include that directory with config.assets "resources/vendor/font-awesome-4.5.0"
.
Then we tell high five to include the FontAwesome css file with config.stylesheets "resources/vendor/font-awesome-4.5.0/css/font-awesome.min.css"
.
This includes the FontAwesome stylesheet in <destination>/index.html
which gives us access to the FontAwesome font-family and the .fa
classes.
That's it!
Follow a similar procedure for any complex resource you wish to include.
Using the config.setting
method, you can create key/value pairs which will be made available in your javascript under HighFive.Settings
.
For example, config.setting apiEndpoint: "http://dev.example.com/api"
will make HighFive.Settings.apiEndpoint
return "http://dev.example.com/api".
Using the config.platform
method defines your target platforms and allows you to create platform-specific configurations.
Platforms are what you tell high five to deploy with the hi5 deploy <platform>
command.
At a minimum this usually includes iOS, Android, and "web" for testing without having to deploy to a device.
The method takes a block whose argument is the same type of config object as the top level config object.
For example, let's say you want to include iOS specific assets into the iOS version of your app.
config.platform :ios do |ios|
ios.assets "resources/ios"
end
When hi5 deploy ios
is ran, high five will include resources/ios
in the destination.
For each platform, you need to make sure config/high_five/app-<platform>.js
exists.
See current examples for the minimum contents required in these files.
This is important for INSERT REASONS HERE. (TODO Why not just say ios.javascripts "ios_specific_javascript_file.js"
instead?)
Environments function like platforms: they allow you to further specify or override either base or platform-specific settings for each of your environments (production/qa/staging/etc).
That is, they take precedence over platform configurations.
Their primary purpose is to set your app's endpoint, but can be used for anything.
e.g. You may want a non-minified asset deployed to your device during development, but the minified version deployed all other times.
An environment is specified with either -e
or --environment
when running hi5 deploy
.
e.g.
hi5 deploy <platform> --environment lan
hi5 deploy <platform> -e production
At a minimum, you will probably want :lan
(so you can deploy an app which is pointed at a server running on your machine) and an entry for each environment your app has (production/staging/qa/etc).
config.environment :lan do |lan|
ip = Socket.ip_address_list.detect { |intf| intf.ipv4? && !intf.ipv4_loopback? && !intf.ipv4_multicast? }.ip_address
lan.setting apiEndpoint: "http://#{ip}:3000"
end
config.environment :dev do |dev|
dev.setting apiEndpoint: "http://dev.example.com"
end
config.environment :production do |production|
production.setting apiEndpoint: "http://example.com"
end
Usage
$ hi5 deploy <platform> -e <environment>
This will build your application for a specific platform with the settings for the given environment to the destination directory specified in config/high_five.rb
.
$ hi5 <android|ios>:set_icon path/to/icon.png
By default, high_five uses ChunkyPNG to resize the icon, but this almost always bad icons.
We highly recommend adding the rmagick gem (which depends on imagemagick) to your Gemfile along with high_five.
High Five will detect that you have rmagick installed and will use it to generate good icons.
$ hi5 <android|ios>:set_version -v "1.0" -b 200
This sets the publicly visible "version string" and the build number. They are in either info.plist
or AndroidManifest.xml
for iOS and Android, respectively.
Compiles the native application to an IPA or APK. This is optional, and instead you may use Xcode, Android Studio, gradle, or any other similar tool.
If you pass it the --install
flag, it will attempt to install to a connected device.
- There's probably more high five commands that should be documented. If you find any not listed here, open an issue or submit a PR.
Development Usage
Build and deploy for browser
hi5 deploy web
Then open index-debug.html inside of google chrome with web security disabled (google-chrome --disable-web-security
)
Build and deploy for device
Make sure your device and computer are on the same wifi network (subnet).
Make sure your server accepts connects from devices on the same subnet.
e.g. For rails, start your server like this:
rails server -b 0.0.0.0
Android
According to Brett, only the first time you put a build on your device, you need to do this (replace the keystore, alias, password, and alias password with the correct values for your app):
hi5 deploy android --environment lan && hi5 dist android --environment lan --install --ant-flags="-Dkey.store=foobar.keystore -Dkey.alias=foobar -Dkey.store.password=foobar -Dkey.alias.password=foobar"
TODO: hi5 dist should use the debug android target instead of release by default if it doesn't detect signing parameters. It should also generate a big warning about that.
After that, this should be sufficient:
hi5 deploy android -e lan && hi5 dist android -e lan --install
However, this did not work for me. I had to always use the first command or else hi5 just kept installing the initial build.
iOS
TODO Write words here. Probably something with Xcode.
Reading the source
TODO Write words here.
Ruby
If you're on Windows, you need both Ruby and the Dev tools. There is a great tutorial here:
https://github.com/oneclick/rubyinstaller/wiki/development-kit
TODO
- Have
hi5 init
create resources/images - Confirm the
assets
method can take a file. - Just create the app-ios.js and app-android.js files instead of app-platform.js. This would get us a little closer to "just working".