@@ -51,7 +51,9 @@ versions before 1.0.0. While SemVer says there is no compatibility before
51
51
and ` x > 0 ` .
52
52
53
53
It is possible to further tweak the logic for selecting compatible versions
54
- using special operators, though it shouldn't be necessary most of the time.
54
+ using special operators as described in the [ Version requirement syntax] ( #version-requirement-syntax ) section.
55
+
56
+ Use the default version requirement strategy, e.g. ` log = "1.2.3" ` where possible to maximize compatibility.
55
57
56
58
## Version requirement syntax
57
59
@@ -158,16 +160,17 @@ separated with a comma, e.g., `>= 1.2, < 1.5`.
158
160
159
161
## Specifying dependencies from other registries
160
162
161
- To specify a dependency from a registry other than [ crates.io] , first the
162
- registry must be configured in a ` .cargo/config.toml ` file. See the [ registries
163
- documentation] for more information. In the dependency, set the ` registry ` key
164
- to the name of the registry to use.
163
+ To specify a dependency from a registry other than [ crates.io] set the ` registry ` key
164
+ to the name of the registry to use:
165
165
166
166
``` toml
167
167
[dependencies ]
168
168
some-crate = { version = " 1.0" , registry = " my-registry" }
169
169
```
170
170
171
+ where ` my-registry ` is the registry name configured in ` .cargo/config.toml ` file.
172
+ See the [ registries documentation] for more information.
173
+
171
174
> ** Note** : [ crates.io] does not allow packages to be published with
172
175
> dependencies on code published outside of [ crates.io] .
173
176
@@ -183,69 +186,113 @@ you need to specify is the location of the repository with the `git` key:
183
186
regex = { git = " https://github.com/rust-lang/regex.git" }
184
187
```
185
188
186
- Cargo will fetch the ` git ` repository at this location then look for a
187
- ` Cargo.toml ` for the requested crate anywhere inside the ` git ` repository
188
- (not necessarily at the root --- for example, specifying a member crate name
189
- of a workspace and setting ` git ` to the repository containing the workspace).
189
+ Cargo fetches the ` git ` repository at that location and traverses the file tree to find
190
+ ` Cargo.toml ` file for the requested crate anywhere inside the ` git ` repository.
191
+ For example, ` regex-lite ` and ` regex-syntax ` are members of ` rust-lang/regex ` repo
192
+ and can be referred to by the repo's root URL (` https://github.com/rust-lang/regex.git ` )
193
+ regardless of where in the file tree they reside.
194
+
195
+ ``` toml
196
+ regex-lite = { git = " https://github.com/rust-lang/regex.git" }
197
+ regex-syntax = { git = " https://github.com/rust-lang/regex.git" }
198
+ ```
199
+
200
+ The above rule does not apply to [ ` path ` dependencies] ( #specifying-path-dependencies ) .
190
201
191
- Since we haven’t specified any other information, Cargo assumes that
192
- we intend to use the latest commit on the default branch to build
193
- our package, which may not necessarily be the main branch.
194
- You can combine the ` git ` key with the ` rev ` , ` tag ` , or ` branch ` keys to
195
- specify something else. Here's an example of specifying that you want to use
196
- the latest commit on a branch named ` next ` :
202
+ ### Choice of commit
203
+
204
+ Cargo assumes that we intend to use the latest commit on the default branch to build
205
+ our package if we only specify the repo URL, as in the examples above.
206
+
207
+ You can combine the ` git ` key with the ` rev ` , ` tag ` , or ` branch ` keys to be more specific about
208
+ which commit to use. Here's an example of using the latest commit on a branch named ` next ` :
197
209
198
210
``` toml
199
211
[dependencies ]
200
212
regex = { git = " https://github.com/rust-lang/regex.git" , branch = " next" }
201
213
```
202
214
203
- Anything that is not a branch or tag falls under ` rev ` . This can be a commit
215
+ Anything that is not a branch or a tag falls under ` rev ` key . This can be a commit
204
216
hash like ` rev = "4c59b707" ` , or a named reference exposed by the remote
205
- repository such as ` rev = "refs/pull/493/head" ` . What references are available
206
- varies by where the repo is hosted; GitHub in particular exposes a reference to
207
- the most recent commit of every pull request as shown, but other git hosts often
208
- provide something equivalent, possibly under a different naming scheme.
209
-
210
- Once a ` git ` dependency has been added, Cargo will lock that dependency to the
211
- latest commit at the time. New commits will not be pulled down automatically
212
- once the lock is in place. However, they can be pulled down manually with
213
- ` cargo update ` .
214
-
215
- See [ Git Authentication] for help with git authentication for private repos.
216
-
217
- > ** Note** : Neither the ` git ` key nor the ` path ` key changes the meaning of the
218
- > ` version ` key: the ` version ` key always implies that the package is available
219
- > in a registry. ` version ` , ` git ` , and ` path ` keys are considered [ separate
220
- > locations] ( #multiple-locations ) for resolving the dependency.
221
- >
222
- > When the dependency is retrieved from ` git ` , the ` version ` key will _ not_
223
- > affect which commit is used, but the version information in the dependency's
224
- > ` Cargo.toml ` file will still be validated against the ` version ` requirement.
217
+ repository such as ` rev = "refs/pull/493/head" ` .
218
+
219
+ What references are available for the ` rev ` key varies by where the repo is hosted.
220
+ GitHub exposes a reference to the most recent commit of every pull request as in the example above.
221
+ Other git hosts may provide something equivalent under a different naming scheme.
222
+
223
+ ** More ` git ` dependency examples:**
224
+
225
+ ``` toml
226
+ # .git suffix can be omitted if the host accepts such URLs - both examples work the same
227
+ regex = { git = " https://github.com/rust-lang/regex" }
228
+ regex = { git = " https://github.com/rust-lang/regex.git" }
229
+
230
+ # a commit with a particular tag
231
+ regex = { git = " https://github.com/rust-lang/regex.git" , tag = " 1.10.3" }
232
+
233
+ # a commit by its SHA1 hash
234
+ regex = { git = " https://github.com/rust-lang/regex.git" , rev = " 0c0990399270277832fbb5b91a1fa118e6f63dba" }
235
+
236
+ # HEAD commit of PR 493
237
+ regex = { git = " https://github.com/rust-lang/regex.git" , rev = " refs/pull/493/head" }
238
+
239
+ # INVALID EXAMPLES
240
+
241
+ # specifying the commit after # ignores the commit ID and generates a warning
242
+ regex = { git = " https://github.com/rust-lang/regex.git#4c59b70" }
243
+
244
+ # git and path cannot be used at the same time
245
+ regex = { git = " https://github.com/rust-lang/regex.git#4c59b70" , path = " ../regex" }
246
+ ```
247
+
248
+ Cargo locks the commits of ` git ` dependencies in ` Cargo.lock ` file at the time of their addition
249
+ and checks for updates only when you run ` cargo update ` command.
250
+
251
+ ### The role of the ` version ` key
252
+
253
+ The ` version ` key always implies that the package is available in a registry,
254
+ regardless of the presence of ` git ` or ` path ` keys.
255
+
256
+ The ` version ` key does _ not_ affect which commit is used when Cargo retrieves the ` git ` dependency,
257
+ but Cargo checks the version information in the dependency's ` Cargo.toml ` file
258
+ against the ` version ` key and raises an error if the check fails.
259
+
260
+ In this example, Cargo retrieves the HEAD commit of the branch called ` next ` from Git and checks if the crate's version
261
+ is compatible with ` version = "1.10.3" ` :
262
+
263
+ ``` toml
264
+ [dependencies ]
265
+ regex = { version = " 1.10.3" , git = " https://github.com/rust-lang/regex.git" , branch = " next" }
266
+ ```
267
+
268
+ ` version ` , ` git ` , and ` path ` keys are considered separate locations for resolving the dependency.
269
+ See [ Multiple locations] ( #multiple-locations ) section below for detailed explanations.
225
270
226
271
> ** Note** : [ crates.io] does not allow packages to be published with
227
272
> dependencies on code published outside of [ crates.io] itself
228
273
> ([ dev-dependencies] are ignored). See the [ Multiple
229
274
> locations] ( #multiple-locations ) section for a fallback alternative for ` git `
230
275
> and ` path ` dependencies.
231
276
232
- [ Git Authentication ] : ../appendix/git-authentication.md
277
+ ### Accessing private Git repositories
278
+
279
+ See [ Git Authentication] ( ../appendix/git-authentication.md ) for help with Git authentication for private repos.
233
280
234
281
## Specifying path dependencies
235
282
236
283
Over time, our ` hello_world ` package from [ the guide] ( ../guide/index.md ) has
237
284
grown significantly in size! It’s gotten to the point that we probably want to
238
285
split out a separate crate for others to use. To do this Cargo supports ** path
239
286
dependencies** which are typically sub-crates that live within one repository.
240
- Let’s start off by making a new crate inside of our ` hello_world ` package:
287
+ Let’s start by making a new crate inside of our ` hello_world ` package:
241
288
242
289
``` console
243
290
# inside of hello_world/
244
291
$ cargo new hello_utils
245
292
```
246
293
247
294
This will create a new folder ` hello_utils ` inside of which a ` Cargo.toml ` and
248
- ` src ` folder are ready to be configured. In order to tell Cargo about this, open
295
+ ` src ` folder are ready to be configured. To tell Cargo about this, open
249
296
up ` hello_world/Cargo.toml ` and add ` hello_utils ` to your dependencies:
250
297
251
298
``` toml
@@ -254,30 +301,50 @@ hello_utils = { path = "hello_utils" }
254
301
```
255
302
256
303
This tells Cargo that we depend on a crate called ` hello_utils ` which is found
257
- in the ` hello_utils ` folder (relative to the ` Cargo.toml ` it’s written in).
304
+ in the ` hello_utils ` folder, relative to the ` Cargo.toml ` file it’s written in.
305
+
306
+ The next ` cargo build ` will automatically build ` hello_utils ` and
307
+ all of its dependencies.
258
308
259
- And that’s it! The next ` cargo build ` will automatically build ` hello_utils ` and
260
- all of its own dependencies, and others can also start using the crate as well.
261
- However, crates that use dependencies specified with only a path are not
262
- permitted on [ crates.io] . If we wanted to publish our ` hello_world ` crate, we
263
- would need to publish a version of ` hello_utils ` to [ crates.io]
264
- and specify its version in the dependencies line as well:
309
+ ### No local path traversal
310
+
311
+ The local paths must point to the exact folder with the dependency's ` Cargo.toml ` .
312
+ Unlike with ` git ` dependencies, Cargo does not traverse local paths.
313
+ For example, if ` regex-lite ` and ` regex-syntax ` are members of a
314
+ locally cloned ` rust-lang/regex ` repo, they have to be referred to by the full path:
315
+
316
+ ``` toml
317
+ # git key accepts the repo root URL and Cargo traverses the tree to find the crate
318
+ [dependencies ]
319
+ regex-lite = { git = " https://github.com/rust-lang/regex.git" }
320
+ regex-syntax = { git = " https://github.com/rust-lang/regex.git" }
321
+
322
+ # path key requires the member name to be included in the local path
323
+ [dependencies ]
324
+ regex-lite = { path = " ../regex/regex-lite" }
325
+ regex-syntax = { path = " ../regex/regex-syntax" }
326
+ ```
327
+
328
+ ### Local paths in published crates
329
+
330
+ Crates that use dependencies specified with only a path are not
331
+ permitted on [ crates.io] .
332
+
333
+ If we wanted to publish our ` hello_world ` crate,
334
+ we would need to publish a version of ` hello_utils ` to [ crates.io] as a separate crate
335
+ and specify its version in the dependencies line of ` hello_world ` :
265
336
266
337
``` toml
267
338
[dependencies ]
268
339
hello_utils = { path = " hello_utils" , version = " 0.1.0" }
269
340
```
270
341
271
- > ** Note** : Neither the ` git ` key nor the ` path ` key changes the meaning of the
272
- > ` version ` key: the ` version ` key always implies that the package is available
273
- > in a registry. ` version ` , ` git ` , and ` path ` keys are considered [ separate
274
- > locations] ( #multiple-locations ) for resolving the dependency.
342
+ The use of ` path ` and ` version ` keys together is explained in the [ Multiple locations] ( #multiple-locations ) section.
275
343
276
344
> ** Note** : [ crates.io] does not allow packages to be published with
277
- > dependencies on code published outside of [ crates.io] itself
278
- > ([ dev-dependencies] are ignored). See the [ Multiple
279
- > locations] ( #multiple-locations ) section for a fallback alternative for ` git `
280
- > and ` path ` dependencies.
345
+ > dependencies on code outside of [ crates.io] , except for [ dev-dependencies] .
346
+ > See the [ Multiple locations] ( #multiple-locations ) section
347
+ > for a fallback alternative for ` git ` and ` path ` dependencies.
281
348
282
349
## Multiple locations
283
350
0 commit comments