kornelski / cargo-deb

Make Debian packages directly from Rust/Cargo projects
https://lib.rs/cargo-deb
MIT License
408 stars 48 forks source link

Workspace-level metadata #68

Open m00nwtchr opened 1 year ago

m00nwtchr commented 1 year ago

Some projects don't have a definite "main" crate in workspace, so it would be nice to be able to define all metadata at the workspace level, esp since workspace-level package metadata is a thing.

girlbossceo commented 3 months ago

How hard would it be for cargo-deb to just read [workspace.package.metadata.deb] or something like this from the top-level Cargo.toml? Maybe keep the name key arbitrary and add a package = "workspace-member" key.

My project is running into this because our "main" will be in src/main/Cargo.toml as our server is completely modular. So there's no [package] key, only a [workspace.package] key at the top level Cargo.toml.

The rationale for this is to make it harder for this kind of metadata or information to go out of sync or outdated, keeping it in the top level is strongly preferred instead of putting it in another Cargo.toml that could get lost.

Additionally, being forced to put this in a workspace now causes assets to use fragile and unappealing relative paths:

license-file = ["../../LICENSE", "3"]
# ..
maintainer-scripts = "../../debian/"
# ..
assets = [
    ["../../debian/README.md", "usr/share/doc/conduwuit/README.Debian", "644"],
    ["../../README.md", "usr/share/doc/conduwuit/", "644"],
    ["../../target/release/conduwuit", "usr/sbin/conduwuit", "755"],
    ["../../conduwuit-example.toml", "etc/conduwuit/conduwuit.toml", "640"],
]

If my quick design there was implemented, my top level Cargo.toml would look something like this:

[workspace]
resolver = "2"
members = ["src/*"]
default-members = ["src/*"]

[workspace.package]
description = "a very cool fork of Conduit, a Matrix homeserver written in Rust"
license = "Apache-2.0"
authors = [
    "strawberry <strawberry@puppygock.gay>",
    "timokoesters <timo@koesters.xyz>",
]
version = "0.4.0"
edition = "2021"
# See also `rust-toolchain.toml`
rust-version = "1.77.0"
homepage = "https://conduwuit.puppyirl.gay/"
repository = "https://github.com/girlbossceo/conduwuit"
readme = "README.md"

[workspace.package.metadata.deb]
name = "conduwuit"

# workspace member package name at: src/main/Cargo.toml
package = "conduwuit"

maintainer = "strawberry <strawberry@puppygock.gay>"
copyright = "2024, strawberry <strawberry@puppygock.gay>"
license-file = ["LICENSE", "3"]
depends = "$auto, ca-certificates"
extended-description = """\
a cool hard fork of Conduit, a Matrix homeserver written in Rust"""
section = "net"
priority = "optional"
conf-files = ["/etc/conduwuit/conduwuit.toml"]
maintainer-scripts = "debian/"
systemd-units = { unit-name = "conduwuit", start = false }
assets = [
    ["debian/README.md", "usr/share/doc/conduwuit/README.Debian", "644"],
    ["README.md", "usr/share/doc/conduwuit/", "644"],
    ["target/release/conduwuit", "usr/sbin/conduwuit", "755"],
    ["conduwuit-example.toml", "etc/conduwuit/conduwuit.toml", "640"],
]

With this, I no longer need to rely on relative paths from a workspace member in another directory, I no longer need to do -p <package> in my CI for cargo-deb as it can simply read the top level Cargo.toml, and this information is easier to maintain.