Pair resources files with types within your program.
dep-t-value
Pair resources files with types within your program.
Part of the dep-t-framework.
How to use
Take a datatype that you want to associate to a resource file, and derive a
Dep.Resource.FromResource
instance for it.Make your program logic take a
Value yourdatatype
record.When assembling the global application environment,
Use
dataDirLoader
to define aLoader
that searches for resource files by following the datatype's module path, and uses the dataype's name as file name.Build the
Value yourdatatype
by using functions formDep.Value.JSON
orDep.Value.Text
.
Links
the built-in
Paths_pkgname
mechanism for accessing data files from package code.the data-files cabal field.
If you decide to import the Paths_pkgname module then it must be listed in the other-modules field just like any other module in your package and on autogen-modules as the file is autogenerated.
the data-dir cabal field.
GitHub issue: Rework data-file handling to be file-embed-like?
Another issue, opened by me: Questions about prefix-independence for data files.
The "prefix-independence" feature seems to be in bad shape:
when ("${pkgroot}"
isPrefixOf
prefix dirs) $ warn verbosity $ "Using ${pkgroot} in prefix " ++ prefix dirs ++ " will not work if you rely on the Path_* module " ++ " or other hard coded paths. Cabal does not yet " ++ " support fully relocatable builds! " ++ " See #462 #2302 #2994 #3305 #3473 #3586 #3909" ++ " #4097 #4291 #4872"However, overriding the data dir using an environment variable is different from "prefix-independence" and it does work:
The actual location of all these directories can be individually overridden at runtime using environment variables of the form pkg_name_var, where pkg_name is the name of the package with all hyphens converted into underscores, and var is either bindir, libdir, dynlibdir, datadir, libexedir or sysconfdir. For example, the configured data directory for pretty-show is controlled with the pretty_show_datadir environment variable.