如何正确引用相同的代码作为依赖的依赖?

问题描述 投票:2回答:2

我有一个玩具项目正在使用Amethyst game engine。我正在尝试编写自己的System来收集用户输入,类似于他们实施FlyMovementSystemArcBallRotationSystemhere

看来正确的收集老鼠运动的方法是通过EventChannel<Event>,其中Event来自winit箱子,紫水晶依赖,但不再出口。

引用紫水晶相同的winit::Event的“正确”方法是什么?

  • 我应该将winit添加到我的Cargo.toml文件中吗?如果是这样,指定版本的推荐方法是什么? (我可以使用一些关键字而不是特定的版本号,以允许我“继承”紫水晶的依赖吗?)
  • 是否真的不鼓励引用子依赖?如果是这样,我应该做什么呢?
rust rust-cargo
2个回答
4
投票

目前没有很好的解决方案来解决这个问题。最好的解决方法是在相同版本的传递依赖项上添加直接依赖项:

[dependencies]
foo = "0.1" 
bar = "0.2" # `foo` depends on bar 0.2 and we need to keep these in sync

您可以使用cargo tree等工具手动识别foo所需的版本,并使您的Cargo.toml保持最新状态。我强烈建议添加注释,说明您选择特定版本的原因。

如果在没有使用底层依赖性的情况下很难使用包,我还鼓励您向父包提交一个问题,要求他们重新导出所需的内容。一个很好的例子是Tokio crate,re-exports large chunks of the futures crate


与您的想法类似,I proposed有一种方法可以使用相同的版本作为依赖。相反,货运团队选择加入public and private dependencies的区别。虽然从工程的角度来看这将是一个更好的解决方案,但在实施它方面进展甚微。

也可以看看:


1
投票

我将离开@ Shepmaster的答案作为被接受的答案,因为它回答了我想要的一般性问题。但是感谢@trentcl的温和推动,如果有人发现这个问题专门针对它与紫水晶的关系,这就是我最终做的事情。

不要试图获得winit::Events

当你将InputBundle<AX, AC>附加到你的GameData时,它会设置一个InputSystem<AX, AC>,它以winit::Events的形式重新发布InputEvent<AC>

它通过将EventChannel<InputEvent<AC>>设置为资源来实现,您可以通过ECS系统中的Read类型访问它。 EventChannels及其用法解释in the Amethyst Book

我已经切换到另一种方法来处理我的用户输入,但这里大概是它的样子(注意:Amethyst a little after v0.10.0):

pub struct MouseMovementSystem {
    reader: Option<ReaderId<InputEvent<()>>>, // AC = () 
}

impl<'s> System<'s> for MouseMovementSystem {
    type SystemData = (
        Read<'s, EventChannel<InputEvent<()>>>,
        /* and others */
    }

    fn run(&mut self, (events, /* and others */): Self::SystemData) {
        let foo = events.read(self.reader.as_mut().unwrap())
            .yadda_yadda(/* ... */); // event processing logic
        do_stuff(foo);
    }

    fn setup(&mut self, res: &mut Resources) {
        use amethyst::core::specs::prelude::SystemData;
        Self::SystemData::setup(res);
        self.reader = Some(res.fetch_mut::<EventChannel<InputEvent<()>>>().register_reader());
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.