[README] Describe crush in detail.

This commit is contained in:
Lorenzo Cogotti 2022-08-15 18:54:20 +02:00
parent ffd72490f7
commit 27ad3d80b6
1 changed files with 109 additions and 2 deletions

View File

@ -1,3 +1,110 @@
# crush
crush - The uncomplicated LÖVE external module system
LÖVE external dependency system.
**crush** is a minimalistic dependency-less external module
system for the LÖVE engine.
It provides a structured and automated approach to manage
and retrieve external libraries within your game project.
## Why?
Lua knows some excellent dependency management system,
such as [LuaRocks](https://luarocks.org).
Though, they are not optimal for a game project, where:
* External libraries should be packed along with the game for distribution.
* External libraries are often small, and their code should be readily hackable by a developer (versioning is not tremendously important).
* Adding a dependency on a complex external package manager is undesireable.
LÖVE games have two ways to manage external libraries:
1. Manually, by direct copy of the external library's source code into the
game project.
* Pulling the latest changes in the library requires copy-pasting the latest version.
* Makes it harder to use libraries depending on other libraries themselves.
2. Using any available Lua package manager during development, and carefully
pack external libraries in the game manually upon distribution.
* Adds a non-trivial additional step to distribution.
* Many existing LÖVE libraries have no support for such package managers.
**crush** provides an alternative way to solve this.
## How to use it?
To use **crush** follow these steps:
1. Copy the latest `crush.lua` into your project's root folder.
2. Create a `.lovedeps` Lua text file in the same directory, here you will list every dependency.
3. With `crush.lua` and `.lovedeps` in place, you can populate, or refresh, the dependencies by running the command:
lua crush.lua
**crush** will fetch the project's dependencies recursively, cloning them to within a `lib` subdirectory.
You can thus use them comfortably in your code with a trivial `require()`, like this:
local serialize = require 'lib.serialize'
This means that **crush** effectively flattens every dependency inside the project's `lib` folder.
## The .lovedeps file
The `.lovedeps` file is a regular Lua text file, containing a table where every entry specifies a dependency:
dependency-name = "git-url"
For example:
-- Fetch lib/serialize from https://git.doublefourteen.io/lua/df-serialize
serialize = "https://git.doublefourteen.io/lua/df-serialize",
-- Fetch lib/gear from https://git.doublefourteen.io/lua/gear
gear = "https://git.doublefourteen.io/lua/gear"
## Philosophy
**crush** is somewhat opinionated and tied to its intended use-case.
It obeys the following general rules:
* Be Self-contained, only a single Lua file: `crush.lua`.
* Must only depend on Lua, LÖVE and `git`, expected to be available on any LÖVE developer machine.
* Do one thing: fetch the dependencies listed in the `.lovedeps` file.
* Be simple and predictable, integrating **crush** into a LÖVE game must be as intuitive as possible.
* Be hackable, its code must be reasonably trivial, understandable and adaptable.
* Enforce one way to do things, encouraging consistency.
* Give in to feature creep.
* Be completely general, its scope is limited to the average LÖVE game or library.
* Be entirely safe, there is no demand for checksum or strict versioning in **crush** use case.
* Break compatibility with older `.lovedeps` files.
If this does not meet some specific requirements,
## Similar projects
* [LÖVERocks](https://github.com/Alloyed/loverocks) is a more involved project with the ambition to bring LuaRocks features to LÖVE.
## License
See [LICENSE](LICENSE) for license information.