使用.NET Core的混合语言和子项目

War*_*ung 7 .net c# f# build

我有一个主要用F#编写的项目,它使用用C#编写的组件.它在Windows上使用Visual Studio构建,在Linux和OS X上使用Makefiles构建.

我正在尝试将其移植到.NET Core,后者拥有自己的构建系统dotnet build.我很难复制我现有构建系统的嵌套项目处理.也就是说,我希望它构建C#DLL,然后构建F#可执行项目并将其链接到它.

我试图没有DLL,但每个project.json文件显然只能用一种语言引用文件.如果你尝试将C#文件添加到compileFiles一个F#项目文件的列表中,dotnet build抱怨说,它不能编译Foo.cs使用fsc.

我的C#项目位于F#项目的子目录中,以它实现的命名空间命名,因此我在该目录中创建了一个新的.NET Core C#DLL项目,但现在我没有看到如何将这两个项目绑定在一起.

dependencies该特征的项目文件格式似乎并没有解决这种问题.如果DLL项目在Foo/Bar并且它实现了Foo.Bar命名空间,则dotnet restore无法使用此依赖项引用找到它:

"dependencies": {
    ...other stuff...
    "Foo.Bar": "*"
},
Run Code Online (Sandbox Code Playgroud)

显然它只能搜索NuGet的依赖项.我不想纯粹将组件运送到NuGet,以便dotnet restore能够找到它.

我不想使用bin语法来引用构建的DLL,因为这需要2遍构建和第三个project.json文件.(一个用于F#项目,一个用于C#项目,一个用于引用构建的DLL.)即便如此,我仍然没有看到如何将第一个项目与第三个项目联系起来.

当然有一种简单的方法来使用嵌套的构建树dotnet build吗?

Fyo*_*kin 1

您的问题是一个项目嵌套在另一个项目之下。如果你把它们并排放置(比如说/src/RootProj/src/Foo.Bar),您应该能够通过以下方式引用该Foo.Bar项目:

"dependencies": { 
  "Foo.Bar": "*" 
}
Run Code Online (Sandbox Code Playgroud)

dnx 项目系统是警察...,咳咳,深受NodeJS 的影响,因此依赖目录结构来推断某些属性。

这些项目预计位于根目录的子文件夹中,并且每个项目都有自己的project.json文件。“根”本身来自global.json位于文件夹树上方的文件。该工具从“当前”文件夹开始遍历文件夹,直到找到一个global.json. 带有 的文件夹global.json将被视为“所有根中的根”。如果您只是从模板创建解决方案,您将得到如下所示的内容:

/solution
   global.json
   /src
      /project1
         project.json
         File.cs
      /project2
         project.json
         File.cs
   /tests
      /testproject1
         project.json
         File.cs
Run Code Online (Sandbox Code Playgroud)

当您位于任何子文件夹中时,工具将通过向上遍历文件夹来了解解决方案根目录。与工作原理类似git

如果您查看该global.json文件,您可能会看到类似以下内容:

{
    "projects": ["src", "tests"]
}
Run Code Online (Sandbox Code Playgroud)

这意味着 dnx 工具将期望在以下位置找到项目/src和下找到项目/tests,仅此而已。

现在,据此,我可以推断出另一种可能的解决方案。我自己没有尝试过,但它可能会起作用。您可以将项目的路径添加到in ,而不是将项目移出Foo.Bar到:/srcprojectsglobal.json

{
    "projects": ["src", "tests", "src/Project1/Foo.Bar"]
}
Run Code Online (Sandbox Code Playgroud)

就像我说的,不确定这是否有效或会产生其他一些微妙的不一致。试试看。