Skip to content

[Merged by Bors] - Fix path used by macro not considering that we can use a sub-crate - #3178

Closed
jcornaz wants to merge 1 commit into
bevyengine:mainfrom
jcornaz:fix/macro_utils_path
Closed

jcornaz wants to merge 1 commit into
bevyengine:mainfrom
jcornaz:fix/macro_utils_path

Conversation

@jcornaz

@jcornaz jcornaz commented Nov 24, 2021 •

Copy link
Copy Markdown
Contributor

Problem

Let's say I am writting a simple bevy plugin, and I want to depend on bevy_ecs crate instead of depending on the full bevy.

So I write the following:

Cargo.toml:

[dependencies]
bevy_ecs = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886" }

lib.rs:

use bevy_ecs::prelude::*;

#[derive(Debug, Default, Component)
pub struct MyFancyComponent;

So far, so good. Everything works. But let's say I want to write some examples for using my plugin. And for theses I'd like to use the bevy crate, so that I can write complete examples (rendering stuff, etc.) that are simple and look like what the consumer of my plugin will do (use bevy::prelude::* and DefaultPlugins)

So I amend my Cargo.toml:

[dependencies]
bevy_ecs = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886" }

[dev-dependencies]
bevy = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886", default-features = false }

And that leads to a complilation error

error[E0433]: failed to resolve: use of undeclared crate or module `bevy`

Basically, because bevy is in the dev-dependencies, the macro (of the production code) decides to use the bevy::ecs path instead of bevy_ecs. But bevy is not available there.

Solution

This PR fixes the problem. I amend the macro utility responsible of finding the path of a module.

If we try to find a path, we first test if this correspond to a crate that the user directly depend on. (Like, if we search for bevy_ecs, we first check if there is a bevy_ecs dependency). If yes, we can depend on that directly. Otherwise, we proceed with the existing logic (testing bevy and bevy_internal)

@github-actions github-actions Bot added the S-Needs-Triage This issue needs to be labelled label Nov 24, 2021

@NiklasEi NiklasEi left a comment •

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch and fix!

@NiklasEi NiklasEi added C-Bug An unexpected or incorrect behavior S-Needs-Review and removed S-Needs-Triage This issue needs to be labelled labels Nov 26, 2021
@cart

cart commented Nov 29, 2021

Copy link
Copy Markdown
Member

bors r+

bors Bot pushed a commit that referenced this pull request Nov 29, 2021
…3178)

# Problem

Let's say I am writting a simple bevy plugin, and I want to depend on `bevy_ecs` crate instead of depending on the full `bevy`. 

So I write the following:

*Cargo.toml*:
```toml
[dependencies]
bevy_ecs = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886" }
```

*lib.rs*:
```rust
use bevy_ecs::prelude::*;

#[derive(Debug, Default, Component)
pub struct MyFancyComponent;
```

So far, so good. Everything works. But let's say I want to write some examples for using my plugin. And for theses I'd like to use the `bevy` crate, so that I can write complete examples (rendering stuff, etc.) that are simple and look like what the consumer of my plugin will do (`use bevy::prelude::*` and `DefaultPlugins`)

So I amend my *Cargo.toml*:
```toml
[dependencies]
bevy_ecs = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886" }

[dev-dependencies]
bevy = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886", default-features = false }
```

And that  leads to a complilation error 

```
error[E0433]: failed to resolve: use of undeclared crate or module `bevy`
```

Basically, because `bevy` is in the `dev-dependencies`, the macro (of the production code) decides to use the `bevy::ecs` path instead of `bevy_ecs`. But `bevy` is not available there.

## Solution

This PR fixes the problem. I amend the macro utility responsible of finding the path of a module.

If we try to find a path, we first test if this correspond to a crate that the user directly depend on. (Like, if we search for `bevy_ecs`, we first check if there is a `bevy_ecs` dependency). If yes, we can depend on that directly. Otherwise, we proceed with the existing logic (testing `bevy` and `bevy_internal`)
@bors

bors Bot commented Nov 29, 2021

Copy link
Copy Markdown

Build failed:

@mockersf

Copy link
Copy Markdown
Member

check fails on reddit links, ignored in #3223

@mockersf

Copy link
Copy Markdown
Member

bors retry

bors Bot pushed a commit that referenced this pull request Nov 29, 2021
…3178)

# Problem

Let's say I am writting a simple bevy plugin, and I want to depend on `bevy_ecs` crate instead of depending on the full `bevy`. 

So I write the following:

*Cargo.toml*:
```toml
[dependencies]
bevy_ecs = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886" }
```

*lib.rs*:
```rust
use bevy_ecs::prelude::*;

#[derive(Debug, Default, Component)
pub struct MyFancyComponent;
```

So far, so good. Everything works. But let's say I want to write some examples for using my plugin. And for theses I'd like to use the `bevy` crate, so that I can write complete examples (rendering stuff, etc.) that are simple and look like what the consumer of my plugin will do (`use bevy::prelude::*` and `DefaultPlugins`)

So I amend my *Cargo.toml*:
```toml
[dependencies]
bevy_ecs = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886" }

[dev-dependencies]
bevy = { git = "https://github.com/bevyengine/bevy.git", rev = "94db0176fecfac7e7e9763f2dc7458a54c105886", default-features = false }
```

And that  leads to a complilation error 

```
error[E0433]: failed to resolve: use of undeclared crate or module `bevy`
```

Basically, because `bevy` is in the `dev-dependencies`, the macro (of the production code) decides to use the `bevy::ecs` path instead of `bevy_ecs`. But `bevy` is not available there.

## Solution

This PR fixes the problem. I amend the macro utility responsible of finding the path of a module.

If we try to find a path, we first test if this correspond to a crate that the user directly depend on. (Like, if we search for `bevy_ecs`, we first check if there is a `bevy_ecs` dependency). If yes, we can depend on that directly. Otherwise, we proceed with the existing logic (testing `bevy` and `bevy_internal`)
@bors bors Bot changed the title Fix path used by macro not considering that we can use a sub-crate [Merged by Bors] - Fix path used by macro not considering that we can use a sub-crate Nov 29, 2021
@bors bors Bot closed this Nov 29, 2021
@jcornaz
jcornaz deleted the fix/macro_utils_path branch November 30, 2021 07:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

C-Bug An unexpected or incorrect behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants