google/zerocopy

Determine whether it's acceptable to remain pinned to a particular version of `syn`, or choose a different workaround

joshlf opened this issue · 2 comments

To work around #1085 until we have a more complete solution, we plan to pin our dependency on syn to a specific version (#1089). We need to remove this workaround and implement a more complete solution before releasing 0.8.

Progress

  • Determine whether continuing to remain pinned to a particular version of syn will be problematic for 0.8; consider both dependency resolution and build-time performance
    • An alternative: could we pin to a particular version only on certain Rust toolchains, but leave it unpinned for more recent toolchains? We would need to consider whether we run the risk of future MSRV bumps, or whether we can structure the dependency in such a way that it just always works. This would resolve the build-time performance issues for most users.
  • If we decide not to continue pinning, consider this workaround:
    • Declare that zerocopy-derive's MSRV is just whatever syn's is (TODO: How do we pin this in CI for testing?)
    • Document that zerocopy's derive feature is exempt from our MSRV
    • After 0.8, work to resolve this - in the most optimistic scenario, we can return to having both crates have the same MSRV, but at least we won't be blocked on it

Bad news. Investigated this locally and it looks like it can cause problems:

$ ls -R
downstream      zerocopy-derive

./downstream:
Cargo.toml src

./downstream/src:
lib.rs

./zerocopy-derive:
Cargo.toml src

./zerocopy-derive/src:
lib.rs

$ cat downstream/Cargo.toml
[package]
name = "downstream"
version = "0.1.0"
edition = "2021"

[dependencies]
syn = "=2.0.54"
zerocopy-derive = { path = "../zerocopy-derive" }

$ cat zerocopy-derive/Cargo.toml
[package]
name = "zerocopy-derive"
version = "0.1.0"
edition = "2021"

[dependencies]
syn = "=2.0.55"

$ cd downstream && cargo check
    Updating crates.io index
error: failed to select a version for `syn`.
    ... required by package `zerocopy-derive v0.1.0 (.../zerocopy-derive)`
    ... which satisfies path dependency `zerocopy-derive` of package `downstream v0.1.0 (.../downstream)`
versions that meet the requirements `=2.0.55` are: 2.0.55

all possible versions conflict with previously selected packages.

  previously selected package `syn v2.0.54`
    ... which satisfies dependency `syn = "=2.0.54"` of package `downstream v0.1.0 (.../downstream)`

failed to select a version for `syn` which could resolve this conflict

Discussed with @jswrenn and @djkoloski and decided that this isn't feasible.