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
(以及可选的 runtime
和 architecture
)很重要,因为您的计算机有多个版本的 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.json
和 NuGet.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.json
和 project.json
的描述尚未完整记录。您可以查看文档的初步版本here。旧文档(在 https://docs.asp.net/en/latest/dnx
下)的链接现在已损坏。
我注意到在创建新的 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
(以及可选的 runtime
和 architecture
)很重要,因为您的计算机有多个版本的 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 存储库(参见
"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.json
和 NuGet.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.json
和 project.json
的描述尚未完整记录。您可以查看文档的初步版本here。旧文档(在 https://docs.asp.net/en/latest/dnx
下)的链接现在已损坏。