如何正确地将同一代码作为依赖项的依赖项进行引用?

3
我有一个玩具项目,使用Amethyst游戏引擎。我正在尝试编写自己的System来收集用户输入,类似于他们在这里实现的FlyMovementSystemArcBallRotationSystem
似乎通过EventChannel<Event>收集鼠标移动的正确方法是使用winit包中的Event,该包是Amethyst依赖的,但不会重新导出。 引用与Amethyst相同的winit::Event的“正确”方法是什么?
  • 我应该在我的Cargo.toml文件中添加winit吗?如果需要,有什么推荐的版本指定方式吗?(是否有一些关键字可以使用而不是具体的版本号,以允许我从Amethyst“继承”依赖项?)
  • 引用子依赖项是否实际上被反对?如果是,我应该做些什么?
2个回答

6
目前还没有很好的解决方案。最佳解决办法是直接添加与传递依赖相同版本的直接依赖项:
[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 创建箱,它重新导出 futures 创建箱的大块内容
类似于你的想法,我提出了一种使用相同版本作为依赖项的方法。但是,Cargo团队选择增加公共和私有依赖项的区分。虽然从工程角度来看这将是更好的解决方案,但在其实施方面几乎没有取得任何进展。
另请参见:
为什么未为明显已实现的类型实现特征?

1
我进一步挖掘了一下,看起来在紫水晶的情况下,它的“InputSystem”负责从“winit”获取事件并将其转换为紫水晶自己的“InputEvent”类型,我能够在不调整我的Cargo.toml的情况下使用它。 - Dylan
1
@Dylan 我鼓励你做出这样的回答;即使它不适用于一般情况,它可能会帮助其他遇到Amethyst相同问题的人。 - trent

1
我将保留@Shepmaster的答案作为已接受的答案,因为它回答了我想要的一般问题。但多亏了@trentcl的推动,以防有人特别寻找与Amethyst相关的问题,以下是我的解决方案。 根本不要尝试获取winit::Events 当您将InputBundle<AX,AC>附加到您的GameData时,它会设置一个InputSystem<AX,AC>,该系统以InputEvent<AC>的形式重新发布winit::Events
它通过设置EventChannel<InputEvent<AC>>作为资源来执行此操作,您可以通过ECS系统中的Read类型访问这些资源。在Amethyst Book中解释了EventChannels及其用法。

我已经改用不同的方法来处理用户输入,但这大致是它的样子(注意:Amethyst 在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());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接