CDN Assets Manager for Elixir
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
config
lib
test
.gitignore
.travis.yml
CHANGELOG.md
README.md
mix.exs
mix.lock

README.md

Elixir CDN Assets Manager

Build Status hex.pm version hex.pm

Content Delivery Network Package for Elixir/Phoenix.

This package provides the developer the ability to upload assets to a CDN with single mix command.
Inspired by Vinelab/cdn.

Overview

Installation

If available in Hex, the package can be installed as:

  1. Add cdn to your list of dependencies in mix.exs:
{:cdn, "~> 0.1.0"}

Configuration

Firstly this package is relies on ex_aws then setting ex_aws before configuration.

:ex_aws must always be added to your applications list.

def application do
  [applications: [:ex_aws, :httpoison, :poison]]
end

Export your AWS access key ID and Secret to your environmet variable(recommend)

export AWS_ACCESS_KEY_ID=your_access_key_id
export AWS_SECRET_ACCESS_KEY=your_secret_access_key

or set config in mix.exs.

config :ex_aws,
  access_key_id: [{:system, "AWS_ACCESS_KEY_ID"}, :instance_role],
  secret_access_key: [{:system, "AWS_SECRET_ACCESS_KEY"}, :instance_role]

and set your region.

config :ex_aws,
  region: "us-east-1"

After that Configure :cdn in config.exs.(Example)

config :cdn,  bucket: "assets.foo",
              include: [
                directories: ["priv/static", "public/bin"],
                patterns: ["**/*", "**/*.css"],
                hidden: true
              ],
              exclude: [
                directories: [],
                patterns: [],
                hidden: true
              ],
              acl: :public_read,
              cache_control: "max-age=#{86400 * 30}",
              expires_after: 86400 * 30,
              cloudfront_url: "https://asset.s3.amazonaws.com",
              bypass: false

This means it should be include files matched pattern **/* or **/*.css in priv/static or public/bin. Also includes hidden files(filename starts with .). And base url for asset helper is https://asset.s3.amazonaws.com, but always outputs local file url for asset helper because bypass is false.

  • bucket: A bucket name of s3
  • include: Setting for upload target
    • directories: List of upload directory(default: ["priv/static"])
    • patterns: List of upload pattern(default: ["**/*"])
    • hidden: Include hidden files or not
  • exclude: Exclude targets
  • acl: Default acl for assets
  • cloudfront_url: URL of CDN endopoint (e.g. https://cloudfonrt.net)
  • bypass: Return local asset if bypass is true in cdn helper.

Usage

Commands

  • Upload to S3
mix cdn.push
  • Empty bucket
mix cdn.empty

Asset Helper

Import CDN Helper to your dependency

  • Phoenix

web.ex

def view do
  quote do
    ...
    # Import CDN helper
    import Cdn.Helpers
    ...
  end
end

then you can load static file like this.

<%= cdn(static_path(@conn, "/css/app.css")) %>

# MIX_ENV=dev
<%= cdn(static_path(@conn, "/css/app.css")) %> #=> "/css/app.css"

# MIX_ENV=prod
<%= cdn(static_path(@conn, "/css/app.css")) %> #=> "https://assets.cloudfront.net/css/app.css"

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request