Releases: software-mansion/scarb
0.1.0
Welcome to the release notes for Scarb v0.1.0! To commemorate that, Cairo 1.0 is reaching Starknet Mainnet tomorrow, on Wednesday 26th March, we are happy to finally drop the prerelease tag from Scarb 🚀 In comparison with Scarb 0.1.0-rc.2, this release brings one new feature:
- Scripts - Packages can now define custom, cross-platform commands aiding in development.
Scripts
This feature should feel familiar to anyone who ever worked in JavaScript ecosystem. Since the popular Cairo 1.0 project template uses make
for defining custom tasks, many projects started doing so. By introducing scripts, we hope to remove one extra dependency users need to have installed on their machines in order to work on Cairo 1.0 projects, and thus, make progress towards our goal of making Scarb the only software you have to install on your machine in order to write Cairo!
To get started, define your scripts in your codebase's Scarb.toml
file under a [scripts]
section:
[scripts]
foo = "echo 'Hello, world!'"
You can now run the foo
script using the new scarb run
command:
scarb run foo
Under the hood, we use deno_task_shell
, which solves a big pain point of NPM scripts: Scarb scripts are cross-platform, and the same commands will run on Linux, macOS and Windows (no need for rimraf
, rm
just works).
See the guide and reference pages in Scarb documentation for more information.
What's next?
We are already working on Scarb 0.2. The main highlights of this release will be profiles (aka debug, release and custom ones) and first steps towards enabling packages to declare dependencies on Cairo compiler plugins. All of these are steps towards making Scarb integrate well with Protostar and other ecosystem tools.
As always, we keep our roadmap public here. Recently, it has undergone quite a sizeable refinement, and we hope you will like what we are cooking for Scarb!
Cairo version
This version of Scarb comes with Cairo v0.1.0-alpha.6
.
Pull requests
- Update
gix
by @mkaput in #199 - Update
directories
by @mkaput in #200 - Update
assert_fs
andpredicates
by @mkaput in #197 - Migrate from Smol to Tokio by @maciektr in #176
- Minor docs improvements by @mkaput in #202
- Use SmolStr for tools manifest by @maciektr in #203
- Add scripts runner by @maciektr in #164
- Scarb branding by @mkaput in #204
- Write MAINTAINING.md by @mkaput in #210
- Add scripts docs by @maciektr in #209
- Bump toml_edit from 0.19.7 to 0.19.8 by @dependabot in #216
- Bump predicates from 3.0.1 to 3.0.2 by @dependabot in #217
- Bump async-trait from 0.1.67 to 0.1.68 by @dependabot in #218
- Prepare release
0.1.0
by @mkaput in #220
Full Changelog: v0.1.0-rc.2...v0.1.0
0.1.0-rc.2
Scarb 0.1 Release Candidate 2
Welcome to the third release candidate of Scarb v0.1.0! We find Scarb to be ready for writing Cairo code and StarkNet contracts, and this release not only updates Cairo to Alpha 6, but also brings several new features that we merged recently:
scarb-metadata
crate - A Rust crate to ease generating and consuming output ofscarb metadata
command.- Breaking changes in metadata format - Several nonsense fields have been removed and several have been added along the way.
[tool.*]
section - Standardized place for adding custom tool-specific fields to `Scarb.toml.[cairo]
section - Pass configuration parameters to Cairo compiler.- Improvements to
scarb add
- This command now sorts dependencies and cleans up added Git repository URLs. - Scarb crate new APIs - Accessors for targets and tool sections, revamp of
CompilationUnit
data structure.
NOTE: This release is back on crates.io.
scarb-metadata
crate
This crate provides structured access to the output of scarb metadata
command. It is meant to be a go-to choice when trying to get information about the workspace from Scarb in extensions.
See crate documentation on docs.rs for more information.
We have already submitted a PR to Cairo Language Server to use this crate, and we advise doing this as well in your projects.
While working on this, we should several missing opportunities or even nonsensical fields in the schema. The changes resulted in a situation that scarb-metadata
will fail to parse outputs of older Scarb versions and vice versa, but Cairo Language Server up to Cairo Alpha 6 has not been affected (because it worked on a subset of the entire schema, that we carefully avoided breaking).
[tool.*]
section
Scarb extensions and other tools now have a place to put their custom configuration data in Scarb.toml
, the [tool]
table. Tools must put their configuration fields in a subtable, and they should use tool name as the key. For example, Protostar will soon use:
[tool.protostar.test]
report-slowest-tests = 5
For more information, checkout the section about [tool]
table in Scarb documentation.
[cairo]
section
Currently, the Cairo compiler has one configuration option, and it was not possible to enable it while using Scarb: an ability to replace IDs in generated Sierra code with their human-readable counterparts. New versions of Cairo will introduce new flags, which brings a need for a possibility to add extra switches in a clear place in the future. Hence, the [cairo]
section has been added to Scarb.toml
.
To enable this feature, now you can simply add the following snippet to Scarb.toml
:
[cairo]
sierra-replace-ids = true
For more information, checkout the section about [cairo]
section in Scarb documentation.
Improvements to scarb add
The scarb add
command has been polished this cycle:
- If the order of entries in
[dependencies]
section is already sorted, it will add new dependencies alphabetically. - It will try to normalize GitHub repository URLs, to slightly improve consistency of dependency entries. Scarb already performed same normalization procedures while pulling dependencies from Git, there is no behaviour difference here.
Thanks to @kariy for contributing these improvements!
Scarb crate new APIs
We added several methods to core data models to ease access to some popular information hidden deep in Manifest
data structure. See merged pull request for a diff of what's added and Scarb crate documentation on docs.rs for more information about these.
Cairo version
This version of Scarb comes with Cairo v0.1.0-alpha.6
.
Pull requests
- Bump actions/add-to-project from 0.4.0 to 0.4.1 by @dependabot in #140
- Sort
[dependencies]
section onscarb add
by @kariy in #143 - Bump serde_json from 1.0.93 to 1.0.94 by @dependabot in #153
- Bump snapbox from 0.4.7 to 0.4.8 by @dependabot in #157
- Bump thiserror from 1.0.38 to 1.0.39 by @dependabot in #156
- Bump indoc from 2.0.0 to 2.0.1 by @dependabot in #155
- Bump clap from 4.1.6 to 4.1.8 by @dependabot in #154
- Generalize logic for getting selected package by @kariy in #152
- Move exit code handling to error types system by @maciektr in #146
- Pass absolute path to read workspace on Scarb new by @maciektr in #161
- Scarb website by @mkaput in #150
- Bump libc from 0.2.139 to 0.2.140 by @dependabot in #168
- Bump async-trait from 0.1.64 to 0.1.66 by @dependabot in #167
- Bump camino from 1.1.3 to 1.1.4 by @dependabot in #165
- Bump serde from 1.0.152 to 1.0.156 by @dependabot in #172
- Bump toml_edit from 0.19.4 to 0.19.6 by @dependabot in #171
- Add tool metadata to manifest by @maciektr in #163
- Canonicalize Git URL in
scarb add
by @kariy in #162 - Add tool section to docs by @maciektr in #182
- Add
[cairo]
section to Scarb.toml by @mkaput in #180 - Create
scarb-metadata
crate by @mkaput in #183 - Add getters for tool metadata tables by @mkaput in #185
- Polish
scarb-metadata
package by @mkaput in #186 - Bump snapbox from 0.4.8 to 0.4.10 by @dependabot in #191
- Bump toml_edit from 0.19.6 to 0.19.7 by @dependabot in #192
- Bump semver from 1.0.16 to 1.0.17 by @dependabot in #193
- Bump anyhow from 1.0.69 to 1.0.70 by @dependabot in #195
- Update Cairo to
1.0.0-alpha.6
by @mkaput in #196 - Bump serde from 1.0.156 to 1.0.158 by @dependabot in #198
- Stabilize metadata format and fix all problems found by @mkaput in #189
Full Changelog: v0.1.0-rc.0...v0.1.0-rc.2
0.1.0-rc.1
Scarb 0.1 Release candidate 1
Welcome to the second release candidate of Scarb v0.1.0. We find Scarb to be ready for writing Cairo code and StarkNet contracts, and this release only updates Cairo and brings fixes since last release candidate.
NOTE: This release will not be published to crates.io, because Cairo Alpha 4 pushed there has a malformed Scarb.toml for core
package. This will be fixed in Cairo Alpha 5 and one more RC of Scarb.
Cairo version
This version of Scarb comes with Cairo v0.1.0-alpha.4
.
Pull requests
- Skip downloading corelib for docs.rs by @maciektr in #147
- Fix clippy error by @maciektr in #170
- Update Cairo to 1.0.0-alpha.4 by @mkaput in #175
Full Changelog: v0.1.0-rc.0...v0.1.0-rc.1
0.1.0-rc.0
Scarb 0.1 Release Candidate
Welcome to the first release candidate of Scarb v0.1.0. We find Scarb to be ready for writing Cairo code and StarkNet contracts, and this release mostly brings small quality of life improvements:
- Ready for Cairo Language Server -
scarb metadata
now outputs necessary information needed for Cairo Language Server to load Scarb projects. scarb rm
- Counterpart toscarb add
, remove dependencies from the project.- Automatically initialize VCS in new projects -
scarb new
/init
can now performgit init
automatically. - Hardened semantics of dependencies' targets - Dependency packages now are checked for having
lib
target turned on. - Override paths to important directories - Use environment variables or CLI flags to override paths to
target
, global cache and global config directories. - Scarb as library new APIs -
Config::builder()
andCompilerRepository
now enables, although in not the most elegant way, to define custom targets in custombuild
commands. - Scarb has been published to crates.io - https://crates.io/crates/scarb/0.1.0-rc.0 🎉
What's next?
This release marks that we believe that Scarb is ready for development of Cairo code and StarkNet contracts. Apart from fixing any arisen issues, we plan to release one more release candidate with Cairo Alpha 4. Then, around time when StarkNet 0.11 will reach Mainnet, we plan to release stable Scarb 0.1.0 🎉
And as always, if you are interested, we maintain a public roadmap.
Cairo version
This version of Scarb comes with Cairo v0.1.0-alpha.3
.
Pull requests
- Allow overriding target directory by @mkaput in #102
- Fix manifest env variable by @maciektr in #103
- Refactor
Config
construction by employing Builder pattern by @mkaput in #104 - fix: manifest impl path by @tarrencev in #106
- Fix issues blocking from publishing to crates.io by @mkaput in #107
- Add some more documentation pieces by @mkaput in #109
- Allow listing installed subcommands by @maciektr in #95
- Add CompilerRepository in Config by @mkaput in #113
- Increase flock test timeout by @maciektr in #112
- Bump gix from 0.37.1 to 0.37.2 by @dependabot in #117
- Bump toml_edit from 0.19.3 to 0.19.4 by @dependabot in #116
- Bump tempfile from 3.3.0 to 3.4.0 by @dependabot in #115
- Prevent non-lib packages from being used as dependencies in other packages by @mkaput in #121
- Add
scarb rm
by @kariy in #122 - Add compilation units to metadata by @maciektr in #114
- Initialize Git repository on
scarb new
&scarb init
by @kariy in #124 - Implement registry caching by @mkaput in #123
Thank you
- @tarrencev made their first contribution in #106
- @kariy made their first contribution in #122
Welcome and a big Thank You!
Full Changelog: v0.1.0-alpha.2...v0.1.0-rc.0
0.1.0-alpha.2
Scarb Third Alpha
Welcome to the third (and hopefully last) alpha release of Scarb. There are two highlights of this version:
- Git dependencies support - Pull dependencies from Git repositories.
scarb add
- Add entries to the[dependencies]
section inScarb.toml
from command line.
Git dependencies support
Scarb is now capable of pulling dependencies from Git repositories. The syntax for specifying such dependencies in Scarb.toml
is identical to one in Cargo:
[dependencies]
quaireaux = { git = "https://github.com/keep-starknet-strange/quaireaux.git" }
As seen in this example, Quaireaux already is a Scarb package 🎉
You can also specify a particular Git reference:
-
Branch:
quaireaux = { git = "https://github.com/keep-starknet-strange/quaireaux.git", branch = "feature/stack" }
-
Tag:
quaireaux = { git = "https://github.com/keep-starknet-strange/quaireaux.git", tag = "v0.1.0" }
-
GitHub pull request:
quaireaux = { git = "https://github.com/keep-starknet-strange/quaireaux.git", rev = "refs/pull/36/head" }
-
Commit hash:
quaireaux = { git = "https://github.com/keep-starknet-strange/quaireaux.git", rev = "e03c883" }
Note: Because there is no Scarb.lock
file yet, Scarb will attempt to git fetch
and update dependencies on each invocation.
scarb add
To ease adoption, we decided to promptly add scarb add
command, which adds requested dependencies to Scarb.toml
file. The interface of this command is almost identical to cargo add
, but one noticeable difference is that Scarb does not yet try to download the dependency to gather its real version (in order to put it in the manifest instead of user-provided version requirement). This interface allows adding any valid dependency specification.
$ scarb add -h
Add dependencies to a Scarb.toml manifest file
Usage: scarb add [OPTIONS] [DEP_ID]...
Arguments:
[DEP_ID]... Reference to a package to add as a dependency
Options:
--dry-run Do not actually write the manifest
--manifest-path <MANIFEST_PATH> Override path to a directory containing a Scarb.toml file [env: SCARB_MANIFEST_PATH=]
-p, --package <PACKAGE> Specify package to modify
-v, --verbose... More output per occurrence
-q, --quiet... Less output per occurrence
--json Print machine-readable output in NDJSON format
--offline Run without accessing the network [env: SCARB_OFFLINE=]
-h, --help Print help (see more with '--help')
Source:
--path <PATH> Filesystem path to local package to add
--git <URI> Git repository location
--branch <BRANCH> Git branch to download the package from
--tag <TAG> Git tag to download the package from
--rev <REV> Git reference to download the package from
For example, to add Quaireaux dependency, you can run:
scarb add quaireaux --git https://github.com/keep-starknet-strange/quaireaux.git
Notable minor changes
- Scarb passes some more information about execution environment via environment variables to subcommands.
- Both
scarb --help
andscarb metadata
will now contain information about Cairo language version bundled with Scarb. - We don't vendor Cairo's
core
library in Scarb's repo any more, instead we pull it from upstream during build time. This still is not the final solution, but it's a step forward. - Added
--offline
flag, which prevents Scarb from doing any network access. scarb -q
will not silent any messages printed to standard output; similarly,scarb -v
will print a little bit more.- Slightly tweaked handling of
.gitignore
file inscarb new
.
Cairo version
This version of Scarb comes with Cairo v0.1.0-alpha.3
.
Pull requests
- Git source support by @mkaput in #69
- Minor QoL improvements in scarb new/init by @mkaput in #81
- Include information what Cairo version is bundled in --version output by @mkaput in #82
- Include Scarb and Cairo versions in metadata output by @mkaput in #83
- Upgrade to Gitoxide 0.36 by @mkaput in #85
- Bump clap from 4.1.4 to 4.1.6 by @dependabot in #87
- Bump once_cell from 1.17.0 to 1.17.1 by @dependabot in #88
- Bump snapbox from 0.4.4 to 0.4.6 by @dependabot in #86
- Update Gitoxide to 0.37.1 by @mkaput in #89
- Pull
core
from starkware-libs/cairo.git by @mkaput in #84 - Pass scarb env vars by @maciektr in #71
- scarb add by @mkaput in #94
Full Changelog: v0.1.0-alpha.1...v0.1.0-alpha.2
0.1.0-alpha.1
Scarb Second Alpha
Welcome to the second alpha release of Scarb. There are two significant updates in this version, that we hope you'll like:
- Multi target architecture - A capability of building various kinds of artefacts, via a notion of package targets:
- Starknet contract target - Build Starknet contracts with the multi-target architecture.
- Built-in CASM compiler - Build CASM code along Sierra.
scarb fmt
- Run Cairo1 formatter over Scarb projects.
Multi target architecture
Like Cargo, Scarb can now treat a package as a library that can also be compiled to several more sophisticated kinds of artefacts. While Cargo is building binaries, tests, benchmarks etc., and this set is hardcoded Scarb can currently build Starknet contracts and the system here is prepared for extensibility by adding custom target kinds via future Scarb extensions.
The most basic aspect of building Sierra code is also a target, called lib
, which is the default one. You can explicitly enable it by adding the following line to Scarb.toml
:
[lib]
Other targets can be added by adding entries to the targets
table, for example in the future you could hypothetically do:
[[targets.dojo-game]]
[[targets.starknet-os]]
All targets have names, which default to the package name. They are used in logs and when naming output artefacts. Note, that for each target kind, each target name must be unique (otherwise targets would overwrite each other). For example, if your package is named foo
, and you want to build it to a file called bar.sierra
, you can add the following snippet to Scarb.toml
:
[lib]
name = "bar"
Note: We are not particularly happy with the fact that all targets share the same crate root. This brings some interesting problems, for example it is not possible to build both lib
and starknet-contract
targets from the single package, because they use mutually incompatible compilers. We plan to tackle this before Scarb release candidate release.
Starknet contract target
Scarb is now capable of building Cairo contracts, if package's Scarb.toml
contains [[target.starknet-contract]]
line:
[package]
name = "hello"
version = "0.1.0"
[[target.starknet-contract]]
Enabling Starknet contract target will cause the compiler to look for contract modules in source, and will emit a contract JSON file in the target/release
directory, instead of raw Sierra, for each found contract.
For more examples, check out related test from Scarb's codebase.
Built-in CASM compiler
In the default lib
target, we added a possibility to automatically compile generated Sierra code to CASM. Simply add these lines to your Scarb.toml
:
[lib]
casm = true
You can also disable generation of Sierra code with:
[lib]
sierra = false
casm = true
scarb fmt
The scarb fmt
command formats all Cairo source files in the project using the official formatter. It also has the --check
argument for use in CI checks. Shortly speaking, scarb fmt
works just exactly the same as cargo fmt
. We tried to mimic its behaviour as close as possible.
Notable minor changes
Better release archives
We have also done some serious release engineering, thanks to which:
-
Release archives now have POSIX-style directory layout. This is a very forward-looking change, as we expect the amount of bundled files to grow in future releases. Scarb binary now resides in the
bin
directory. -
We now publish checksums of release archives. You can verify integrity of downloaded archives with:
sha256sum --ignore-missing --check checksums.sha256
-
We added builds for Linux AArch64 platform.
OpenSSL dependency
This release does not depend on OpenSSL, so it should work on any Linux distribution, no matter whether it is OpenSSL 1.1 or 3.0-based.
Cairo version
This version of Scarb comes with Cairo starkware-libs/cairo@e0665d8.
Pull requests
- Make
create-output-dir
crate not depend oncargo-util
. Releasecreate-output-dir
1.0.0 by @mkaput in #53 - Bump indoc from 1.0.8 to 1.0.9 by @dependabot in #56
- Bump clap from 4.1.1 to 4.1.4 by @dependabot in #57
- Fix fixed durations in flock tests by actively listening to stdout by @mkaput in #59
- Multi-target architecture by @mkaput in #55
- Rework release workflow by @mkaput in #62
- Build StarkNet contracts by @mkaput in #61
- Bump toml_edit version by @maciektr in #68
- scarb fmt by @maciektr in #66
Full Changelog: v0.1.0-alpha.0...v0.1.0-alpha.1
0.1.0-alpha.0
Introducing Scarb!
We are pleased to announce the first alpha release of Scarb, a build toolchain and package manager for everything Cairo 1.0!
Scarb is being developed by a team at @software-mansion, spun off the software-mansion/protostar team, and we are closely collaborating with @starkware-libs while working on this project.
See our annoucement blog post for more information!
OpenSSL on Linux
Linux package depends on OpenSSL version 1.1. If you use a newer distro with is based on OpenSSL 3 (such as latest Ubuntu releases), you will have to install OpenSSL 1.1 before running Scarb. We plan to fix this in next alpha release.
New Contributors
- @mkaput made their first contribution in #1
- @maciektr made their first contribution in #16
- @dependabot made their first contribution in #44
Full Changelog: https://github.com/software-mansion/scarb/commits/v0.1.0-alpha.0