Skip to content

Commit 58ddb28

Browse files
committed
Implement workspaces in Cargo
This commit is an implementation of [RFC 1525] which specifies the addition of **workspaces** to Cargo. [RFC 1525]: https://github.com/rust-lang/rfcs/blob/master/text/1525-cargo-workspace.md A workspace is a group of crates which are all compiled into the same output directory and share the same `Cargo.lock` file. This means that dependencies are cached between builds as well as dependencies all being shared at the same versions. An update to any one dependency transitively affects all other members of the workspace. Typical repository layouts with a crate at the root and a number of path dependencies simply need to add the following to the root `Cargo.toml`: ```toml [workspace] ``` Otherwise more advanced configuration may be necessary through the `package.workspace` or `workspace.members` keys. More information can be found as part of [RFC 1525].
1 parent 5716f32 commit 58ddb28

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1861
-385
lines changed

src/bin/bench.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, CliError, Human, Config, human};
34
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -91,7 +92,8 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
9192
},
9293
};
9394

94-
let err = try!(ops::run_benches(&root, &ops, &options.arg_args));
95+
let ws = try!(Workspace::new(&root, config));
96+
let err = try!(ops::run_benches(&ws, &ops, &options.arg_args));
9597
match err {
9698
None => Ok(None),
9799
Some(err) => {

src/bin/build.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::env;
22

3+
use cargo::core::Workspace;
34
use cargo::ops::CompileOptions;
45
use cargo::ops;
56
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -86,6 +87,7 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
8687
target_rustc_args: None,
8788
};
8889

89-
try!(ops::compile(&root, &opts));
90+
let ws = try!(Workspace::new(&root, config));
91+
try!(ops::compile(&ws, &opts));
9092
Ok(None)
9193
}

src/bin/clean.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::env;
22

3+
use cargo::core::Workspace;
34
use cargo::ops;
45
use cargo::util::{CliResult, Config};
56
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -50,6 +51,7 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
5051
target: options.flag_target.as_ref().map(|s| &s[..]),
5152
release: options.flag_release,
5253
};
53-
try!(ops::clean(&root, &opts));
54+
let ws = try!(Workspace::new(&root, config));
55+
try!(ops::clean(&ws, &opts));
5456
Ok(None)
5557
}

src/bin/doc.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, Config};
34
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -84,6 +85,7 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
8485
},
8586
};
8687

87-
try!(ops::doc(&root, &doc_opts));
88+
let ws = try!(Workspace::new(&root, config));
89+
try!(ops::doc(&ws, &doc_opts));
8890
Ok(None)
8991
}

src/bin/fetch.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, Config};
34
use cargo::util::important_paths::find_root_manifest_for_wd;
@@ -38,7 +39,8 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
3839
options.flag_quiet,
3940
&options.flag_color));
4041
let root = try!(find_root_manifest_for_wd(options.flag_manifest_path, config.cwd()));
41-
try!(ops::fetch(&root, config));
42+
let ws = try!(Workspace::new(&root, config));
43+
try!(ops::fetch(&ws));
4244
Ok(None)
4345
}
4446

src/bin/generate_lockfile.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::env;
22

3+
use cargo::core::Workspace;
34
use cargo::ops;
45
use cargo::util::{CliResult, Config};
56
use cargo::util::important_paths::find_root_manifest_for_wd;
@@ -33,6 +34,7 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
3334
&options.flag_color));
3435
let root = try!(find_root_manifest_for_wd(options.flag_manifest_path, config.cwd()));
3536

36-
try!(ops::generate_lockfile(&root, config));
37+
let ws = try!(Workspace::new(&root, config));
38+
try!(ops::generate_lockfile(&ws));
3739
Ok(None)
3840
}

src/bin/metadata.rs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
extern crate cargo;
2-
extern crate docopt;
3-
extern crate rustc_serialize;
4-
extern crate toml;
5-
1+
use cargo::core::Workspace;
62
use cargo::ops::{output_metadata, OutputMetadataOptions, ExportInfo};
73
use cargo::util::important_paths::find_root_manifest_for_wd;
84
use cargo::util::{CliResult, Config};
@@ -48,12 +44,12 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<ExportInfo
4844

4945
let options = OutputMetadataOptions {
5046
features: options.flag_features,
51-
manifest_path: &manifest,
5247
no_default_features: options.flag_no_default_features,
5348
no_deps: options.flag_no_deps,
5449
version: options.flag_format_version,
5550
};
5651

57-
let result = try!(output_metadata(options, config));
52+
let ws = try!(Workspace::new(&manifest, config));
53+
let result = try!(output_metadata(&ws, &options));
5854
Ok(Some(result))
5955
}

src/bin/package.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, Config};
34
use cargo::util::important_paths::find_root_manifest_for_wd;
@@ -38,7 +39,8 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
3839
options.flag_quiet,
3940
&options.flag_color));
4041
let root = try!(find_root_manifest_for_wd(options.flag_manifest_path, config.cwd()));
41-
try!(ops::package(&root, &ops::PackageOpts {
42+
let ws = try!(Workspace::new(&root, config));
43+
try!(ops::package(&ws, &ops::PackageOpts {
4244
config: config,
4345
verify: !options.flag_no_verify,
4446
list: options.flag_list,

src/bin/pkgid.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, Config};
34
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -51,9 +52,10 @@ pub fn execute(options: Options,
5152
options.flag_quiet,
5253
&options.flag_color));
5354
let root = try!(find_root_manifest_for_wd(options.flag_manifest_path.clone(), config.cwd()));
55+
let ws = try!(Workspace::new(&root, config));
5456

5557
let spec = options.arg_spec.as_ref().map(|s| &s[..]);
56-
let spec = try!(ops::pkgid(&root, spec, config));
58+
let spec = try!(ops::pkgid(&ws, spec));
5759
println!("{}", spec);
5860
Ok(None)
5961
}

src/bin/publish.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, Config};
34
use cargo::util::important_paths::find_root_manifest_for_wd;
@@ -47,7 +48,8 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
4748
} = options;
4849

4950
let root = try!(find_root_manifest_for_wd(flag_manifest_path.clone(), config.cwd()));
50-
try!(ops::publish(&root, &ops::PublishOpts {
51+
let ws = try!(Workspace::new(&root, config));
52+
try!(ops::publish(&ws, &ops::PublishOpts {
5153
config: config,
5254
token: token,
5355
index: host,

src/bin/run.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, CliError, Config, Human};
34
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -85,7 +86,8 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
8586
target_rustc_args: None,
8687
};
8788

88-
match try!(ops::run(&root, &compile_opts, &options.arg_args)) {
89+
let ws = try!(Workspace::new(&root, config));
90+
match try!(ops::run(&ws, &compile_opts, &options.arg_args)) {
8991
None => Ok(None),
9092
Some(err) => {
9193
// If we never actually spawned the process then that sounds pretty

src/bin/rustc.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::env;
22

3+
use cargo::core::Workspace;
34
use cargo::ops::{CompileOptions, CompileMode};
45
use cargo::ops;
56
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -104,7 +105,8 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
104105
target_rustc_args: options.arg_opts.as_ref().map(|a| &a[..]),
105106
};
106107

107-
try!(ops::compile(&root, &opts));
108+
let ws = try!(Workspace::new(&root, config));
109+
try!(ops::compile(&ws, &opts));
108110
Ok(None)
109111
}
110112

src/bin/rustdoc.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, Config};
34
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -91,7 +92,8 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
9192
},
9293
};
9394

94-
try!(ops::doc(&root, &doc_opts));
95+
let ws = try!(Workspace::new(&root, config));
96+
try!(ops::doc(&ws, &doc_opts));
9597

9698
Ok(None)
9799
}

src/bin/test.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use cargo::core::Workspace;
12
use cargo::ops;
23
use cargo::util::{CliResult, CliError, Human, human, Config};
34
use cargo::util::important_paths::{find_root_manifest_for_wd};
@@ -119,7 +120,8 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
119120
},
120121
};
121122

122-
let err = try!(ops::run_tests(&root, &ops, &options.arg_args));
123+
let ws = try!(Workspace::new(&root, config));
124+
let err = try!(ops::run_tests(&ws, &ops, &options.arg_args));
123125
match err {
124126
None => Ok(None),
125127
Some(err) => {

src/bin/update.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::env;
22

3+
use cargo::core::Workspace;
34
use cargo::ops;
45
use cargo::util::{CliResult, Config};
56
use cargo::util::important_paths::find_root_manifest_for_wd;
@@ -66,6 +67,7 @@ pub fn execute(options: Options, config: &Config) -> CliResult<Option<()>> {
6667
config: config,
6768
};
6869

69-
try!(ops::update_lockfile(&root, &update_opts));
70+
let ws = try!(Workspace::new(&root, config));
71+
try!(ops::update_lockfile(&ws, &update_opts));
7072
Ok(None)
7173
}

src/cargo/core/manifest.rs

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@ use std::path::{PathBuf, Path};
44
use semver::Version;
55
use rustc_serialize::{Encoder, Encodable};
66

7-
use core::{Dependency, PackageId, PackageIdSpec, Summary};
7+
use core::{Dependency, PackageId, PackageIdSpec, Summary, WorkspaceConfig};
88
use core::package_id::Metadata;
99

10+
pub enum EitherManifest {
11+
Real(Manifest),
12+
Virtual(VirtualManifest),
13+
}
14+
1015
/// Contains all the information about a package, as loaded from a Cargo.toml.
1116
#[derive(Clone, Debug)]
1217
pub struct Manifest {
@@ -20,6 +25,13 @@ pub struct Manifest {
2025
profiles: Profiles,
2126
publish: bool,
2227
replace: Vec<(PackageIdSpec, Dependency)>,
28+
workspace: WorkspaceConfig,
29+
}
30+
31+
#[derive(Clone, Debug)]
32+
pub struct VirtualManifest {
33+
replace: Vec<(PackageIdSpec, Dependency)>,
34+
workspace: WorkspaceConfig,
2335
}
2436

2537
/// General metadata about a package which is just blindly uploaded to the
@@ -175,7 +187,8 @@ impl Manifest {
175187
metadata: ManifestMetadata,
176188
profiles: Profiles,
177189
publish: bool,
178-
replace: Vec<(PackageIdSpec, Dependency)>) -> Manifest {
190+
replace: Vec<(PackageIdSpec, Dependency)>,
191+
workspace: WorkspaceConfig) -> Manifest {
179192
Manifest {
180193
summary: summary,
181194
targets: targets,
@@ -187,6 +200,7 @@ impl Manifest {
187200
profiles: profiles,
188201
publish: publish,
189202
replace: replace,
203+
workspace: workspace,
190204
}
191205
}
192206

@@ -207,6 +221,10 @@ impl Manifest {
207221
self.links.as_ref().map(|s| &s[..])
208222
}
209223

224+
pub fn workspace_config(&self) -> &WorkspaceConfig {
225+
&self.workspace
226+
}
227+
210228
pub fn add_warning(&mut self, s: String) {
211229
self.warnings.push(s)
212230
}
@@ -216,6 +234,24 @@ impl Manifest {
216234
}
217235
}
218236

237+
impl VirtualManifest {
238+
pub fn new(replace: Vec<(PackageIdSpec, Dependency)>,
239+
workspace: WorkspaceConfig) -> VirtualManifest {
240+
VirtualManifest {
241+
replace: replace,
242+
workspace: workspace,
243+
}
244+
}
245+
246+
pub fn replace(&self) -> &[(PackageIdSpec, Dependency)] {
247+
&self.replace
248+
}
249+
250+
pub fn workspace_config(&self) -> &WorkspaceConfig {
251+
&self.workspace
252+
}
253+
}
254+
219255
impl Target {
220256
fn blank() -> Target {
221257
Target {

src/cargo/core/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub use self::dependency::{Dependency, DependencyInner};
22
pub use self::manifest::{Manifest, Target, TargetKind, Profile, LibKind, Profiles};
3+
pub use self::manifest::{EitherManifest, VirtualManifest};
34
pub use self::package::{Package, PackageSet};
45
pub use self::package_id::{PackageId, Metadata};
56
pub use self::package_id_spec::PackageIdSpec;
@@ -8,6 +9,7 @@ pub use self::resolver::Resolve;
89
pub use self::shell::{Shell, MultiShell, ShellConfig, Verbosity, ColorConfig};
910
pub use self::source::{Source, SourceId, SourceMap, GitReference};
1011
pub use self::summary::Summary;
12+
pub use self::workspace::{Workspace, WorkspaceConfig};
1113

1214
pub mod source;
1315
pub mod package;
@@ -19,3 +21,4 @@ pub mod summary;
1921
pub mod shell;
2022
pub mod registry;
2123
mod package_id_spec;
24+
mod workspace;

0 commit comments

Comments
 (0)