Skip to content
master
Switch branches/tags
Go to file
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 

README.md

Purescript Rules for Bazel

Adding purescript support to your bazel repo

This repo is the beginnings of support for purescript in Bazel. In order to use this put the following into your WORKSPACE file:

# refer to a githash in this repo:
rules_purescript_version = "38abb155c30502c9996925640b9b8e04bd48d974"

# download the archive:
http_archive(
    name = "io_bazel_rules_purescript",
    url  = "https://github.com/felixmulder/rules_purescript/archive/%s.zip" % rules_purescript_version,
    type = "zip",
    strip_prefix = "rules_purescript-%s" % rules_purescript_version,
)

# load the purescript rules and functions:
load("@io_bazel_rules_purescript//purescript:purescript.bzl", "purescript_toolchain", "purescript_dep")

# downloads the `purs` command:
purescript_toolchain()

# add some dependencies:
purescript_dep(
    name = "purescript_console",
    url = "https://github.com/purescript/purescript-console/archive/v4.1.0.tar.gz",
    sha256 = "5b0d2089e14a3611caf9d397e9dd825fc5c8f39b049d19448c9dbbe7a1b595bf",
    strip_prefix = "purescript-console-4.1.0",
)

purescript_dep(
    name = "purescript_effect",
    url = "https://github.com/purescript/purescript-effect/archive/v2.0.0.tar.gz",
    sha256 = "5254c048102a6f4360a77096c6162722c4c4b2449983f26058d75d4e5be9d301",
    strip_prefix = "purescript-effect-2.0.0",
)

purescript_dep(
    name = "purescript_prelude",
    url = "https://github.com/purescript/purescript-prelude/archive/v4.0.1.tar.gz",
    sha256 = "3b69b111875eb2b915fd7bdf320707ed3d22194d71cd51d25695d22ab06ae6ee",
    strip_prefix = "purescript-prelude-4.0.1",
)

Defining a project

With this in place you can now define a BUILD file for your project:

load("@io_bazel_rules_purescript//purescript:purescript.bzl", "purescript_app", "purescript_test")

dependencies = \
    [ "@purescript_console//:pkg"
    , "@purescript_effect//:pkg"
    , "@purescript_prelude//:pkg"
    ]

# Defines an application with default entrypoint (Main.main):
purescript_app(
    name       = "purs-app",
    visibility = ["//visibility:public"],
    srcs       = glob(["src/**/*.purs"]),
    deps       = dependencies,
)

You can now build your program and run the main function!

If you want to customize the entrypoint, you can do something like:

purescript_app(
    name             = "purs-app",
    visibility       = ["//visibility:public"],
    srcs             = glob(["src/**/*.purs"]),
    deps             = dependencies,
    entry_module     = "MyModule",
    entry_function   = "myFunction",
    entry_parameters = [ "my", "parameters" ],
)

Depending on other Bazel Purescript Projects

Currently this is as simple as adding the label to your project's dependencies. There's a known issue with the way this is currently implemented. Files with the same name will overwrite each other. This is detailed in #4.

Example of depending on other bazel purescript project:

purescript_app(
    name             = "purs-app",
    visibility       = ["//visibility:public"],
    srcs             = glob(["src/**/*.purs"]),
    deps             = [ "//lib:purs-lib" ] + dependencies,
)

Testing

In the same BUILD file, you can define a test module:

purescript_test(
    name = "purs-app-test",
    srcs = glob(["test/**/*.purs"]) + glob(["src/**/*.purs"]),
    deps = dependencies,
)

in the test directory I've created a module like:

module Test.Main where

-- imports omitted

main :: Effect Unit
main = log "Hello test world!"

when you run bazel test on the :purs-app-test project, it should succeed 🎉

NOTE: the default entrypoint for testing is the module Test.Main and the function main. But these can be overwritten:

purescript_test(
    name          = "purs-app-test",
    srcs          = glob(["test/**/*.purs"]) + glob(["src/**/*.purs"]),
    deps          = dependencies,
    main_module   = "MyMainTest.Whatever"
    main_function = "myFun"
)

About

Purescript rules for Bazel

Topics

Resources

License

Releases

No releases published

Packages

No packages published