locka99 / opcua

A client and server implementation of the OPC UA specification written in Rust
Mozilla Public License 2.0
480 stars 129 forks source link

duplicate dependencies #177

Closed lovasoa closed 1 year ago

lovasoa commented 2 years ago

It looks like opcua-server has many duplicate dependencies

❯ cargo tree --duplicates
bytes v0.4.12
└── opcua-crypto v0.10.0 (/home/olojkine/dev/opcua-rust/crypto)
    ├── opcua-core v0.10.0 (/home/olojkine/dev/opcua-rust/core)
    │   └── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)
    └── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)

bytes v1.1.0
├── opcua-core v0.10.0 (/home/olojkine/dev/opcua-rust/core) (*)
├── tokio v1.15.0
│   ├── opcua-core v0.10.0 (/home/olojkine/dev/opcua-rust/core) (*)
│   ├── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)
│   └── tokio-util v0.6.9
│       ├── opcua-core v0.10.0 (/home/olojkine/dev/opcua-rust/core) (*)
│       └── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)
└── tokio-util v0.6.9 (*)

itoa v0.4.8
└── csv v1.1.6
    └── criterion v0.2.11
        [dev-dependencies]
        └── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)

itoa v1.0.1
└── serde_json v1.0.74
    ├── criterion v0.2.11 (*)
    ├── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)
    └── tinytemplate v1.2.1
        └── criterion v0.2.11 (*)

proc-macro2 v0.4.30
├── derivative v1.0.4 (proc-macro)
│   └── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)
├── quote v0.6.13
│   ├── derivative v1.0.4 (proc-macro) (*)
│   └── syn v0.15.44
│       └── derivative v1.0.4 (proc-macro) (*)
└── syn v0.15.44 (*)

proc-macro2 v1.0.36
├── futures-macro v0.3.19 (proc-macro)
│   └── futures-util v0.3.19
│       ├── futures v0.3.19
│       │   ├── opcua-core v0.10.0 (/home/olojkine/dev/opcua-rust/core) (*)
│       │   └── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)
│       └── futures-executor v0.3.19
│           └── futures v0.3.19 (*)
├── quote v1.0.14
│   ├── futures-macro v0.3.19 (proc-macro) (*)
│   ├── serde_derive v1.0.133 (proc-macro)
│   │   ├── criterion v0.2.11 (*)
│   │   ├── opcua-core v0.10.0 (/home/olojkine/dev/opcua-rust/core) (*)
│   │   ├── opcua-crypto v0.10.0 (/home/olojkine/dev/opcua-rust/crypto) (*)
│   │   ├── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)
│   │   └── opcua-types v0.10.0 (/home/olojkine/dev/opcua-rust/types)
│   │       ├── opcua-core v0.10.0 (/home/olojkine/dev/opcua-rust/core) (*)
│   │       ├── opcua-crypto v0.10.0 (/home/olojkine/dev/opcua-rust/crypto) (*)
│   │       └── opcua-server v0.10.0 (/home/olojkine/dev/opcua-rust/server)
│   ├── syn v1.0.85
│   │   ├── futures-macro v0.3.19 (proc-macro) (*)
│   │   ├── serde_derive v1.0.133 (proc-macro) (*)
│   │   └── tokio-macros v1.7.0 (proc-macro)
│   │       └── tokio v1.15.0 (*)
│   └── tokio-macros v1.7.0 (proc-macro) (*)
├── serde_derive v1.0.133 (proc-macro) (*)
├── syn v1.0.85 (*)
└── tokio-macros v1.7.0 (proc-macro) (*)

quote v0.6.13 (*)

quote v1.0.14 (*)

rand_core v0.3.1
├── criterion v0.2.11 (*)
└── rand_xoshiro v0.1.0
    └── criterion v0.2.11 (*)

rand_core v0.4.2
├── rand_core v0.3.1 (*)
└── rand_os v0.1.3
    └── criterion v0.2.11 (*)

syn v0.15.44 (*)

syn v1.0.85 (*)

unicode-xid v0.1.0
├── proc-macro2 v0.4.30 (*)
└── syn v0.15.44 (*)

unicode-xid v0.2.2
├── proc-macro2 v1.0.36 (*)
└── syn v1.0.85 (*)
locka99 commented 2 years ago

That's because each opcua- component is a separate crate, therefore each has to say its dependencies in the Cargo.toml.

It might be possible in 0.10 to refactor the codebase from separate crates into a single create that uses features to determine what someone wants to use - server, client or server & client. This would cut the duplicate dependencies.

lovasoa commented 2 years ago

It does not seem to only come from the multiple crates. Just opcua-server alone for instance, depends both on proc-macro2 0.4 and 1.0.

locka99 commented 1 year ago

I'll close this since the opcua lib has been refactored into a single crate, so any remaining duplicates are through dependencies I pull in and out of my control.