允许两个项目继承同一个债券
Allowing two projects to inherit from the same bond
在 C# 项目中使用 Microsoft Bond。
假设我在一个项目 A' 中使用了一个 Bond 文件 A,并希望两个项目 B' 和 C' 具有 Bond 文件 B 和 C,这两个项目都具有从文件 A 中的结构继承的结构。我该怎么做?
我考虑制作一个 ProjectReference,但它似乎只提供从这些 Bond 文件生成的 C# 类,并且不允许我从原始 Bond 文件继承 Bond,所以我改为制作了一个link 从一个项目到另一个项目。不幸的是,我当前的解决方案非常容易出错,更改一个项目中的文件位置也会破坏另一个项目。
建议的方法是什么?
要让债券文件 B 和 C 继承或包含债券文件 A 的类型(在项目 A' 中),您需要在 B 和 C 的顶部导入债券文件 A。这使得 A 中的类型在 B 和 C 中已知。
a.bond
namespace A;
struct Base { }
b.bond
import "a.bond"
namespace B;
struct Derived : A.Base { }
struct Composition {
// notice fully qualified name is used for Base
0: A.Base has_a_base;
}
对于导入路径,您有以下三种选择:
- 使用像
import "C:/src/projectAPrime/schemas/a.bond"
这样的完全限定路径
- 使用相对路径,如
import "../../projectAPrime/schemas/a.bond"
- 使用
import "a.bond"
或 import "schemas/a.bond"
之类的相对路径并添加到 Bond 导入路径:在消费项目的其他地方,您要确保 BondImportDirectory
项已增加带有项目 A 的搜索目录。
我不推荐第一个选项,因为它将路径与特定机器的布局联系在一起。选项 2 或 3 的混合在实践中使用。
对于方法三,使用项目通常直接包含这样的内容,或者通过它导入的其他一些 MSBuild 文件。
<ItemGroup>
<BondImportDirectory Include="$(ProjectAPrimeRoot)" />
<!-- or some other reference to project A, depending
on how your projects are structured (perhaps you
have a all_projects.props file for these sort of
variables or item modifications -->
</ItemGroup>
我不能给你比这更具体的指导,因为我不知道你的具体项目结构,而且 MSBuild 没有办法让项目“导出”引用项目自动获取的值(我知道)。
请注意,您仍然需要对项目 A' 的 ProjectReference,因为在项目 B' 和 C' 中生成的代码将依赖于生成并编译到项目 A' 生成的程序集中的代码。
有关使用 BondImportDirectory
导入的工作示例,请参阅 Bond 存储库中的 C# import example。但是,这不会解决跨项目导入问题,因此您需要根据自己的情况进行调整。
如果您是 C++ 开发人员,这应该类似于 #include
路径。
在 C# 项目中使用 Microsoft Bond。
假设我在一个项目 A' 中使用了一个 Bond 文件 A,并希望两个项目 B' 和 C' 具有 Bond 文件 B 和 C,这两个项目都具有从文件 A 中的结构继承的结构。我该怎么做?
我考虑制作一个 ProjectReference,但它似乎只提供从这些 Bond 文件生成的 C# 类,并且不允许我从原始 Bond 文件继承 Bond,所以我改为制作了一个link 从一个项目到另一个项目。不幸的是,我当前的解决方案非常容易出错,更改一个项目中的文件位置也会破坏另一个项目。
建议的方法是什么?
要让债券文件 B 和 C 继承或包含债券文件 A 的类型(在项目 A' 中),您需要在 B 和 C 的顶部导入债券文件 A。这使得 A 中的类型在 B 和 C 中已知。
a.bond
namespace A;
struct Base { }
b.bond
import "a.bond"
namespace B;
struct Derived : A.Base { }
struct Composition {
// notice fully qualified name is used for Base
0: A.Base has_a_base;
}
对于导入路径,您有以下三种选择:
- 使用像
import "C:/src/projectAPrime/schemas/a.bond"
这样的完全限定路径
- 使用相对路径,如
import "../../projectAPrime/schemas/a.bond"
- 使用
import "a.bond"
或import "schemas/a.bond"
之类的相对路径并添加到 Bond 导入路径:在消费项目的其他地方,您要确保BondImportDirectory
项已增加带有项目 A 的搜索目录。
我不推荐第一个选项,因为它将路径与特定机器的布局联系在一起。选项 2 或 3 的混合在实践中使用。
对于方法三,使用项目通常直接包含这样的内容,或者通过它导入的其他一些 MSBuild 文件。
<ItemGroup>
<BondImportDirectory Include="$(ProjectAPrimeRoot)" />
<!-- or some other reference to project A, depending
on how your projects are structured (perhaps you
have a all_projects.props file for these sort of
variables or item modifications -->
</ItemGroup>
我不能给你比这更具体的指导,因为我不知道你的具体项目结构,而且 MSBuild 没有办法让项目“导出”引用项目自动获取的值(我知道)。
请注意,您仍然需要对项目 A' 的 ProjectReference,因为在项目 B' 和 C' 中生成的代码将依赖于生成并编译到项目 A' 生成的程序集中的代码。
有关使用 BondImportDirectory
导入的工作示例,请参阅 Bond 存储库中的 C# import example。但是,这不会解决跨项目导入问题,因此您需要根据自己的情况进行调整。
如果您是 C++ 开发人员,这应该类似于 #include
路径。