.net core: 为什么dotnet restore 会生成一个"lock" 文件,它有什么用?

.net core: Why dotnet restore generates a "lock" file, what's the usage of it?

我是 dot.net 核心的新手,尝试了示例、dotnet new、dotnet restore、dotnet 运行。

在第二步(dotnet restore)之后,我试图删除这个锁定文件,然后 "dotnet run" 失败了,因为它说它需要一个锁定文件。微软为什么要设计这样一个"lock"文件,为什么"run"命令需要这样一个锁文件?

如果这个锁文件是为了防止多个进程构建项目,那么它只需要是一个空文件,作为一个"lock"。但实际上,这个文件相对于其他源代码来说是相当大的。

如果您查看锁定文件,您会发现它包含已恢复的每个依赖项的确切版本的详细信息,可传递。 "locks" dotnet restore 之前的那组版本又是 运行。

我相信目标至少 允许开发人员决定是否将 project.lock.json 文件签入源代码管理,从而更好地控制更新依赖项的确切时间会被使用。我认为关于 when/whether 这是个好主意仍有一些争论。

它还允许多个工具直接查看依赖关系图,而不需要再次计算它(如果依赖关系发生变化,可能以一种不稳定的方式)。

有差异。如果您检查该文件的内容,您会发现它包含应用程序正在使用的所有 NuGet 包的完整列表。这不一定与 project.json 中包含的内容相同,因为 project.json 可以使用通配符并且对其版本(例如 1.0.0.*)含糊不清。它也比 project.json 更完整,因为它包括 project.json 中指定的框架中包含的所有库。这是 project.json.lock 文件的一小段摘录:

摘自: https://blog.falafel.com/what-is-project-lock-json/

                   "locked": false,
                   "version": -9996,
                   "targets": {
                "DNX,Version=v4.5.1": {
                  "Microsoft.AspNet.DataProtection.Abstractions/1.0.0-beta5": {
                    "dependencies": {
                      "Microsoft.Framework.Runtime.Abstractions": "1.0.0-beta5"
                    },
                    "frameworkAssemblies": [
                      "mscorlib",
                      "System",
                      "System.Core",
                      "Microsoft.CSharp"
                    ],
                    "compile": {
                      "lib/dnx451/Microsoft.AspNet.DataProtection.Abstractions.dll": {}
                    },
                    "runtime": {
                      "lib/dnx451/Microsoft.AspNet.DataProtection.Abstractions.dll": {}
                    }
                  }