我正在尝试自动构建一个 ASP.NET Core 应用程序,该应用程序对属于同一项目的 Nuget 包具有两种类型的依赖项:
- 作为努力的一部分,对 Nuget 包的直接依赖也正在积极开发中
- 在同一解决方案中引用“经典”.NET 程序集项目,这些项目依赖于我们也在开发的 Nuget 包
我想要构建此解决方案以获取最新版本的 Nuget 包,然后“做正确的事”。
让我们从上面的#1开始:
使用dnu install (deprecated) 我可以有效地更新到最新版本的 Nuget 包;但是,这仅当我在与我的 xproj 相同的目录中运行 dnu install 时。为什么?因为有三个位置(但 AFAICT 未命名)参数:包 id、版本、项目位置- 所以如果我想指定项目位置,我必须输入一个版本,但是如果我想要最新的应该放什么?试过 * 但没有用。
理想情况下,无论如何我都想使用Coreclr dotnet 客户端,但是按照设计,它没有安装选项。
现在案例 #2 我的“经典”装配项目有一个使用nuget update的预构建步骤,它为我们的项目提取最新的 nuget 并适当地构建(这类似于我的案例 #1)。
但是,尽管重建了 ASP.NET 项目,但在我的 ASP.NET Core 应用程序中对这些项目的引用似乎并未更新。在解决方案资源管理器中,依赖 nuget 的版本保持在我手动添加它们作为参考时的版本。我发现修复的唯一方法——即使只是在 Visual Studio 中工作——是删除引用然后重新添加它们(好像“包装”机制不会自动启动)。
所有这一切让我觉得完全自动化这个构建是不可能的——希望我错了:)
修改为在下面包含更多详细信息
下面是 Visual Studio 中显示的项目结构,它完全正确构建。
这是 global.json:
{
"projects": [
"src",
"test",
"wrap"
],
"sdk": {
"version": "1.0.0-rc1-update1"
}
}
这是 API 项目的完整 project.json:
{
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},
"dependencies": {
"Lnl.Saas.Diagnostics": "1.0.0-*",
"Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
"Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
"Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
"Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.FileProviderExtensions": "1.0.0-rc1-final",
"Microsoft.Extensions.Configuration.Json": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.Console": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.Debug": "1.0.0-rc1-final",
"Microsoft.Extensions.Logging.TraceSource": "1.0.0-rc1-final"
},
"commands": {
"web": "Microsoft.AspNet.Server.Kestrel"
},
"frameworks": {
"dnx452": {
"dependencies": {
"Account.Model": "1.0.0-*",
"Account.Service": "1.0.0-*"
}
}
},
"exclude": [
"wwwroot",
"node_modules"
],
"publishExclude": [
"**.user",
"**.vspscc"
]
}
现在我重建创建上述解决方案中引用的 Nuget 包的项目(未显示)。
然后我希望能够重建上面的帐户解决方案以引入更新的 Nugets
- 最新版 Lnl.Saas.Diagnostics 直接进入 API 项目
- 将另外两个 Nugets 添加到 Service 项目中(这通过 nuget install post-build 工作),然后更新 API 项目中对 Service 的引用,以便它引用 NEW nugets。
请注意下面的诊断 Nuget 参考没有改变(服务中的也没有改变,但我忘了在第一个屏幕截图上展开它)
如果我查看 Nuget 包管理器 UI,它会知道有更新,如果我使用 UI,它们就会被应用。
如果我在包管理器控制台中运行dnu restore,它会列出新包但(重新?)安装以前的包 - 在 project.lock.json 中明确命名。
通过尝试拼凑文档,我得到的印象dnu restore在这里做的是“正确”的事情,我需要使用dnu install,如果我在与 project.json 文件相同的目录中运行它,它确实有效(但如果我尝试从另一个目录运行,我的自动化脚本所在的位置,我不能/不知道在版本(第二个)参数中放什么,现在需要它,因为我提供了一个项目位置(第三个)参数) .
http://docs.asp.net/en/latest/dnx上的文档非常缺乏,当关注一些链接时,我找到了具有更好文档的dotnet.github.io项目(但没有明显提及它适用于 rc2)。
最后,也许这提供了一些额外的线索,是在构建时我收到一个警告(这似乎不会在运行时引起问题),例如:
警告 MSB3274 无法解析主要引用“C:...\Account\Service\bin\Debug\Account.Service.dll”,因为它是针对“.NETFramework,Version=v4.5.2”框架构建的。这是比当前目标框架“.NETFramework,Version=v4.5.1”更高的版本。
但不知道如何解决,因为我不知道我在哪里/如何使用 API 项目定位 4.5.1 框架。