【问题标题】:Explanation of the projects section in Global.json in ASP.NET 5ASP.NET 5 中 Global.json 中项目部分的说明
【发布时间】:2016-01-14 14:10:51
【问题描述】:

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

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

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

我在 ASP.NET 5 文档中找到了以下内容: projects 属性指定哪些文件夹包含解决方案的源代码。默认情况下,项目结构将源文件放置在 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 中指定的每个路径创建一个工件文件夹。所以我想知道我是要为解决方案中的每个项目创建一个工件文件夹,还是只为外部的一个大项目。

【问题讨论】:

    标签: c# asp.net asp.net-core asp.net-core-mvc


    【解决方案1】:

    首先,我会将您转至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 Entity Framework 7 (the 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",然后通过在解决方案视图中选择并单击 Del 键在 Visual Studio 中删除以前添加的项目.

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

    另一个非常重要的可选文件,可能存在于解决方案层次结构中,是NuGet.config 文件。它定义了 NuGet 提要,将在其中加载包。问题在于有许多 NuGet 存储库(请参阅the answer),它们具有不同的初始版本 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.jsonhttps://www.myget.org/F/aspnetmaster/api/v3/index.json

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

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

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

    solution
        src
            project
            folderWithProjects
    

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

    solution
        src
            project
            folderWithProjects
        test
            testproject1
            testproject2
    

    (您可以在 GitHub 或 MVC6 here 上检查 Entity Framework 7 的结构)。您可以按照结构或选择其他位置并修改global.json"projects" 部分。

    更新:微软在 RC1 和 RC2 之间做了很多改变。 Dnx.exe 在 ASP.NET Core 中将不再使用。应该改用dotnet.exe。新的/修改的 global.jsonproject.json 的描述尚未完整记录。您可以查看文档here 的初步版本。旧文档(https://docs.asp.net/en/latest/dnx 下)上的链接现已损坏。

    【讨论】:

    • 非常感谢您的深入回复!它为我清除了很多东西。因此,如果我坚持标准结构,我假设我不需要在 global.json 的项目部分中添加任何额外的行,对吗?只是“src”。此外,如果您在创建新项目时没有为您提供测试文件夹,为什么默认情况下会出现“测试”。我的测试文件夹可以放在 src/project/test 中吗?
    • @BlakeRivell:不客气!带有"test" 的标准模板对应于使用Microsoft 的文件夹结构。以github.com/aspnet/EntityFramework 为例。您会看到solution 文件夹不仅有src 文件夹,还有用于进行测试的项目的separate 文件夹test。您可以持有该结构或使用您现有的持有人:src/project/test。在最后一种情况下,您可以从 global.json 中删除 , "test"
    • 如果我有 2 个单独的 src 文件夹(每个项目一个)并在 global.json 中同时指定它们,你认为这会是个问题吗?
    • @BlakeRivell:总的来说应该没问题,但是我看到了一些效果,当Visual Studio自动扫描新项目并在保存"projects"部分global.json后添加项目时.在其他情况下,多次重新打开解决方案并没有帮助很长时间。我不确定是什么原因。无论如何,我似乎成功地重新扫描了具有多个 src 文件夹的多个项目。我不确定你的问题。您是否计划项目的新结构,或者您已经有一个大型解决方案,但您遇到了一些实际问题?
    • 新链接又是 404
    猜你喜欢
    • 1970-01-01
    • 2013-01-27
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多