mirror of
https://github.com/rust-lang/cargo.git
synced 2025-10-01 11:30:39 +00:00
cargo metadata: Don't show null
deps.
If a package has a dependency without a library target, the "name" field was showing up as null in `resolve.nodes.deps`. At this time (AFAIK), binary-only dependencies are always ignored. Instead of making users filter out this entry (or more commonly, crash), just don't include it.
This commit is contained in:
parent
b296129ab8
commit
c3f4b0db2d
@ -105,7 +105,7 @@ where
|
|||||||
{
|
{
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
struct Dep {
|
struct Dep {
|
||||||
name: Option<String>,
|
name: String,
|
||||||
pkg: PackageId,
|
pkg: PackageId,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,13 +123,12 @@ where
|
|||||||
dependencies: resolve.deps(id).map(|(pkg, _deps)| pkg).collect(),
|
dependencies: resolve.deps(id).map(|(pkg, _deps)| pkg).collect(),
|
||||||
deps: resolve
|
deps: resolve
|
||||||
.deps(id)
|
.deps(id)
|
||||||
.map(|(pkg, _deps)| {
|
.filter_map(|(pkg, _deps)| {
|
||||||
let name = packages
|
packages
|
||||||
.get(&pkg)
|
.get(&pkg)
|
||||||
.and_then(|pkg| pkg.targets().iter().find(|t| t.is_lib()))
|
.and_then(|pkg| pkg.targets().iter().find(|t| t.is_lib()))
|
||||||
.and_then(|lib_target| resolve.extern_crate_name(id, pkg, lib_target).ok());
|
.and_then(|lib_target| resolve.extern_crate_name(id, pkg, lib_target).ok())
|
||||||
|
.map(|name| Dep { name, pkg })
|
||||||
Dep { name, pkg }
|
|
||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
features: resolve.features_sorted(id),
|
features: resolve.features_sorted(id),
|
||||||
|
@ -212,7 +212,7 @@ The output has the following format:
|
|||||||
*/
|
*/
|
||||||
"deps": [
|
"deps": [
|
||||||
{
|
{
|
||||||
/* The name of the dependency.
|
/* The name of the dependency's library target.
|
||||||
If this is a renamed dependency, this is the new
|
If this is a renamed dependency, this is the new
|
||||||
name.
|
name.
|
||||||
*/
|
*/
|
||||||
|
@ -219,7 +219,7 @@ for a Rust API for reading the metadata.</p>
|
|||||||
*/
|
*/
|
||||||
"deps": [
|
"deps": [
|
||||||
{
|
{
|
||||||
/* The name of the dependency.
|
/* The name of the dependency's library target.
|
||||||
If this is a renamed dependency, this is the new
|
If this is a renamed dependency, this is the new
|
||||||
name.
|
name.
|
||||||
*/
|
*/
|
||||||
|
@ -233,7 +233,7 @@ The output has the following format:
|
|||||||
*/
|
*/
|
||||||
"deps": [
|
"deps": [
|
||||||
{
|
{
|
||||||
/* The name of the dependency.
|
/* The name of the dependency\(aqs library target.
|
||||||
If this is a renamed dependency, this is the new
|
If this is a renamed dependency, this is the new
|
||||||
name.
|
name.
|
||||||
*/
|
*/
|
||||||
|
@ -1669,3 +1669,32 @@ fn metadata_links() {
|
|||||||
)
|
)
|
||||||
.run()
|
.run()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn deps_with_bin_only() {
|
||||||
|
let p = project()
|
||||||
|
.file(
|
||||||
|
"Cargo.toml",
|
||||||
|
r#"
|
||||||
|
[package]
|
||||||
|
name = "foo"
|
||||||
|
version = "0.1.0"
|
||||||
|
[dependencies]
|
||||||
|
bdep = { path = "bdep" }
|
||||||
|
"#,
|
||||||
|
)
|
||||||
|
.file("src/lib.rs", "")
|
||||||
|
.file("bdep/Cargo.toml", &basic_bin_manifest("bdep"))
|
||||||
|
.file("bdep/src/main.rs", "fn main() {}")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
let output = p
|
||||||
|
.cargo("metadata")
|
||||||
|
.exec_with_output()
|
||||||
|
.expect("cargo metadata failed");
|
||||||
|
let stdout = std::str::from_utf8(&output.stdout).unwrap();
|
||||||
|
let meta: serde_json::Value = serde_json::from_str(stdout).expect("failed to parse json");
|
||||||
|
let nodes = &meta["resolve"]["nodes"];
|
||||||
|
assert!(nodes[0]["deps"].as_array().unwrap().is_empty());
|
||||||
|
assert!(nodes[1]["deps"].as_array().unwrap().is_empty());
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user