ASP.NET 5 中 Global.json 中项目部分的说明

Explanation of the projects section in Global.json in ASP.NET 5

我注意到在创建新的 ASP.NET 5 项目时有一个 src 目录,这对我来说完全有意义,因为我总是将我所有解决方案的代码放在一个名为 source 的目录中。

我注意到有一个名为 global.json 的文件,默认情况下包含以下内容:

{
  "projects": [ "src", "test" ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

我在 ASP.NET5 文档中找到以下内容: 项目 属性 指定哪些文件夹包含解决方案的源代码。默认情况下,项目结构将源文件放在 src 文件夹中,允许将构建工件放在同级文件夹中,从而更容易从源代码控制中排除此类内容。

但是,这是我想到的项目结构(基本上是在同一个解决方案下我想要的 2 个大项目):

MySolution
    MySolutionProject1Src
        client
            p1.WebAPI
        business
            p1.Business
            p1.Model
        data
            p1.Repository
        test
            p1.BusinessTests
            p1.WebAPITests


    MySolutionProject2Src
        client
            p2.Web
        business
            p2.Business
            p2.Model
        data
            p2.Repository
        test
            p2.BusinessTests

那么我会把 global.json 更新为以下内容吗? (每个父目录一个):

{
  "projects": [ "MySolutionProject1Src", "MySolutionProject2Src" ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

或者应该更像这样(每个子目录一个):

{
  "projects": [ "MySolutionProject1Src/client", "MySolutionProject1Src/business", "MySolutionProject1Src/data" "MySolutionProject1Src/test", "MySolutionProject2Src/client", "MySolutionProject2Src/business", "MySolutionProject2Src/data" "MySolutionProject2Src/test" ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

或者我应该只是将其保留为 "src" 并将所有内容作为子文件夹放在 src..

我假设我可以创建我想要的任何解决方案结构,但我担心的是在更新 global.json 项目部分以匹配它时要遵循的规则。根据文档,它说将为 global.json 中指定的每个路径创建一个工件文件夹。所以我想知道我是否要为解决方案中的每个项目都创建一个工件文件夹,还是只为外部的一个大项目创建一个工件文件夹。

首先,我会将您转到 the part of documentation,其中描述了 global.json

{
  "projects": [ "src", "test" ],
  "sdk": {
        "version": "1.0.0-beta5",
        "runtime": "clr",
        "architecture": "x86"
  }
}

version(以及可选的 runtimearchitecture)很重要,因为您的计算机有多个版本的 dnx.exe。您可以检查 %USERPROFILE%\.dnx\runtimes 目录以查看所有已安装的运行时。 global.json"sdk" 部分定义了您安装的运行时之一的 dnx.exe 版本。

重要的是要了解 global.json"projects" 部分,它将被扫描 所有同级文件夹 在每个目录下的任何级别上。将找到的每个 project.json 将被解释为解决方案的项目。

例如,您可以下载 ASP.NET 的某些部分并将其放置在解决方案层次结构的新子文件夹中。例如,您可以下载 RC1 source of Entity Framework 7 (the file) 将 zip-file 解压到项目的 src 文件夹内的新 ef 文件夹中。您会看到,在重新打开解决方案后的短时间内,您的项目列表会越来越长,所有 Entity Framework 7 个组件都将包含在您的解决方案中。以同样的方式,您可以将下载的源解压缩到单独的目录 C:\aspnet\EF7 并使用

{
  "projects": [ "src", "c:/aspnet/EF7" ],
  "sdk": {
    "version": "1.0.0-rc1-update1"
  }
}

你会得到同样的效果。如果您稍后决定删除 Entity Framework 7 的调试源,那么您应该从 global.json 中排除 "c:/aspnet/EF7",然后通过在解决方案视图中选择并删除 Visual Studio 之前添加的项目单击 Del 键。

我认为它应该清除文件夹结构中的可能性。

解决方案层次结构中可能存在的另一个非常重要的可选文件是 NuGet.config 文件。它定义了 NuGet 提要,包将被加载到其中。问题是有 许多 个 NuGet 存储库(参见 ),它们具有 不同的初步版本 ASP.NET 5组件。如果您使用 确切的 依赖项,例如

"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"

然后只需要在 NuGet 存储库中拥有显式版本。问题是有时人们会使用

这样的依赖关系
"EntityFramework.MicrosoftSqlServer": "7.0.0-*"

加载最新版本的包。如果您使用错误的 NuGet 提要,那么您可以获得早期的 RC2 版本,它与其他 RC1 包不兼容(至少因为在 beta 版本之间重命名了许多组件)。为确保您的解决方案(所有项目)使用 RC1,您可以将以下 NuGet.config 放入解决方案文件夹(在所有项目之上),例如以下内容

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageRestore>
    <clear /> <!-- ensure only the sources defined below are used -->
    <add key="automatic" value="False" />
  </packageRestore>
  <packageSources>
    <add key="AspNetVNext" value="https://www.myget.org/F/aspnetmaster/api/v3/index.json" />
    <add key="NuGet" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
  <activePackageSource>
    <add key="AspNetVNext" value="true"  />
    <add key="NuGet" value="true"  />
  </activePackageSource>
</configuration>

参见 the documentation。我建议你在一些项目文件夹中打开命令行并执行

dnu feeds list

命令。它将显示来自当前文件夹和父文件夹的所有 NuGet.config 以及全局文件 %appdata%\NuGet\NuGet.Config 合并 。 NuGet 将在所有活动存储库中搜索包。在上述情况下它将是 https://api.nuget.org/v3/index.json and https://www.myget.org/F/aspnetmaster/api/v3/index.json

如果存在多个 NuGet.config,则可能存在冲突,指向不同的 NuGet 提要或 enable/disable 某些提要。命令 dnu feeds list 在这里有帮助。您应该始终扫描项目层次结构中的所有 NuGet.config 文件以 prevent/resolve 冲突。许多冲突的解决主要在于使用正确的提要或使用显式版本来解决包。

我建议您阅读 the article,其中描述了 NuGet 配置继承

我希望您能决定哪种结构更适合您现有的环境。我建议您持有 标准结构

solution
    src
        project
        folderWithProjects

并将 global.jsonNuGet.config 放在解决方案目录中。 test-projects的默认位置:与主要项目分开:

solution
    src
        project
        folderWithProjects
    test
        testproject1
        testproject2

(你可以在GitHub or MVC6 here上查看Entity Framework7的结构)。您可以按照结构或选择其他位置并修改 global.json.

"projects" 部分

更新: Microsoft 在 RC1 和 RC2 之间做了很多更改。 Dnx.exe 不会更多地用于 ASP.NET 核心。应该改用 dotnet.exe 。 new/modified global.jsonproject.json 的描述尚未完整记录。您可以查看文档的初步版本here。旧文档(在 https://docs.asp.net/en/latest/dnx 下)的链接现在已损坏。