我注意到在创建一个新的ASP.NET 5项目时,有一个对我来说完全有意义的src目录,因为我总是将所有解决方案的代码放在一个名为source的目录中。
我注意到有一个名为global.json的文件,默认情况下包含以下内容:
{
"projects": [ "src", "test" ],
"sdk": {
"version": "1.0.0-rc1-update1"
}
}
我在ASP.NET 5文档中找到了以下内容: projects属性指定哪些文件夹包含解决方案的源代码。默认情况下,项目结构将源文件放在src文件夹中,允许将构建工件放在兄弟文件夹中,从而更容易从源代码控制中排除这些内容。
然而,这里是我想到的项目结构(在同一解决方案中基本上是我想要的两个大型项目):
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中指定的每个路径创建一个artifacts文件夹。所以我想知道我是否需要为解决方案中的每个项目创建一个工件文件夹,或者只是外部的一个大项目。
答案 0 :(得分:22)
首先,我会转发你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
目录以查看所有已安装的运行时。 "sdk"
的{{1}}部分定义了您安装的其中一个运行时的global.json
版本。
了解dnx.exe
"projects"
global.json
部分的重要性是,它将在目录下的任何级别扫描所有同级文件夹。将找到的每个project.json
都将被解释为解决方案的项目。
您可以下载ASP.NET的某些部分并将其放在解决方案层次结构的新子文件夹中。例如,您可以下载RC1实体框架7的源代码(the file),将zip文件解压缩到项目的ef
文件夹内的新src
文件夹中。您将看到,在重新打开解决方案后的短时间内,项目列表将越来越长,并且所有Entity Framework 7组件都将包含在您的解决方案中。以同样的方式,您可以在单独的目录C:\aspnet\EF7
中提取下载的源并使用
{
"projects": [ "src", "c:/aspnet/EF7" ],
"sdk": {
"version": "1.0.0-rc1-update1"
}
}
你会有同样的效果。如果您以后决定删除调试Entity Framework 7的源代码,那么您应该从"c:/aspnet/EF7"
中排除global.json
,然后在Visual Studio中删除以前在解决方案视图中选择的项目,然后单击 Del < / kbd> key。
我认为它应该清除你在文件夹结构中的可能性。
可能存在于解决方案层次结构中的另一个非常重要的可选文件是NuGet.config
文件。它定义了NuGet feed,它将加载包。问题是许多 NuGet存储库(请参阅the answer),它们具有 ASP.NET 5组件的不同初始版本。如果您使用确切的依赖关系,例如
"EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final"
然后需要在NuGet存储库中拥有显式版本。问题是有时候会使用像
这样的依赖"EntityFramework.MicrosoftSqlServer": "7.0.0-*"
加载包的最新版本。如果您使用错误的NuGet feed,那么您可以获得早期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和https://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.json
和NuGet.config
放在解决方案目录中。测试项目的默认位置:与主项目分开:
solution
src
project
folderWithProjects
test
testproject1
testproject2
(您可以在GitHub或MVC6 here)上检查实体框架7的结构。您可以按照结构或选择其他位置并修改"projects"
的{{1}}部分。
更新: Microsoft在RC1和RC2之间做了很多更改。 ASP.NET核心中不再使用global.json
。应该使用Dnx.exe
代替。新/已修改dotnet.exe
和global.json
的说明尚未完整记录。您可以看到文档here的初步版本。旧文档(project.json
下)的链接现已破损。