Baked File System
Include (bake them) static files into a binary at compile time and access them anytime you need.
Installation
Add this to your application's shard.yml
:
dependencies:
baked_file_system:
github: xtokio/baked_file_system
Usage
A custom type that extends BakedFileSystem
is used as a file system. The macro bake_folder
bakes all files in
a given path into the virtual file system. Both relative and absolute paths are supported, as well as baking multiple
folders.
require "baked_file_system"
class FileStorage
extend BakedFileSystem
bake_folder "/home/my_name/work/crystal_project/public"
bake_folder "../public"
end
Files can be loaded using get
and get?
class methods.
file = FileStorage.get("path/to/file.png")
file.gets_to_end # returns content of file
file.path # returns path of file
file.size # returns size of original file
When try to get missing file, get
raises a BakedFileSystem::NoSuchFileError
exception
while get?
returns nil
.
begin
FileStorage.get "missing/file"
rescue BakedFileSystem::NoSuchFileError
puts "File #{path} is missing"
end
FileStorage.get? "missing/file" # => nil
Example of FileStorage
class
class FileStorage
extend BakedFileSystem
bake_folder "/Users/luis/Desktop/Code/Crystal/apps/baked/public"
def self.css
files = [
"/assets/css/dashboard.css"
]
self.bake_files(files)
end
def self.js
files = [
"/assets/js/main.js",
"/assets/js/main_1.js"
]
self.bake_files(files)
end
def self.image(image_path)
Base64.encode(FileStorage.get(image_path).gets_to_end)
end
private def self.bake_files(files)
output_string = ""
files.each do |file|
output_string = output_string + FileStorage.get(file).gets_to_end
end
output_string
end
end
Use it in HTML
<style>
<%= FileStorage.css %>
</style>
<img src="data:image/png;base64, <%= FileStorage.image("/assets/img/user.png") %>">
<script>
<%= FileStorage.js %>
</script>
Development
TODO Write development instructions here
Contributing
- Fork it ( https://github.com/xtokio/baked_file_system/fork )
- Create your feature branch (git checkout -b my-new-feature)
- Commit your changes (git commit -am 'Add some feature')
- Push to the branch (git push origin my-new-feature)
- Create a new Pull Request
Contributors
- schovi David Schovanec - creator
- straight-shoota Johannes Müller