发布.Net Core RC1应用程序后,project.json中指定的命令具有为其创建的相应.cmd文件,这些文件可在部署后执行(例如web.cmd和ef.cmd) . 在我的例子中,我想在我的部署目标上运行以下Entity Framework命令:
dotnet ef database update -c MyContext
当我从包含源代码的文件夹运行它时,这工作正常,但是在发布后,它似乎没有在编译的DLL中找到命令 . 我对RC2命令变化的理解是“工具”可以编译为名为dotnet - * .dll的独立应用程序,并且可以通过CLI执行 . 如何将实体框架核心工具公开为已发布输出中的可执行DLL?
仅供参考,我的构建/部署工作流程如下:
TeamCity
dotnet restore => dotnet build => dotnet test => dotnet publish
Octopus Deploy
上传包=> EF更新数据库=>等
2 回答
我在项目中遇到了同样的问题,但由于多种原因,我不希望迁移在应用程序启动时自动运行 .
为了解决这个问题,我更新了
Program.cs
以获取两个参数(完整代码列在下面)--ef-migrate
,以应用所有待处理的迁移,以及--ef-migrate-check
,用于验证是否已应用所有迁移如果存在参数,则应用EF操作并退出程序,否则启动Web应用程序 .
请注意,它取决于
Microsoft.Extensions.CommandLineUtils
包以简化命令行解析 .For octopus deploy 然后可以将包发布两次到单独的位置 - 一个用于运行迁移,另一个用于webhosting . 在我们的例子中,我们添加了一个"post deploy powershell script"的内容
In a docker context 它也能完美地运作
完整的Program.cs,不包括命名空间和使用:
有一个非常有用的帖子解决了这个问题here .
它对我有用(我不得不稍微调整一下命令,但它给了我一个很好的基础) .
总而言之:您可以通过传递
ef.dll
来复制dotnet ef database update
命令(例如直接从您的nuget文件夹(或者从其他地方,如果您没有nuget,因为您在prod机器上...))与您的.dll包含使用一些附加参数(见下文)迁移到dotnet.exe
(或等效的linux) .为了完整性,这里是.cmd(也来自博客帖子!)
(如果此cmd位于博客帖子中,则为bash版本)
顺便说一句 . 在许多github问题中也提到了这种方法:https://github.com/aspnet/EntityFramework.Docs/issues/328 https://github.com/aspnet/EntityFramework.Docs/issues/180
ps: I found this in the blog of Ben Day, so all credit goes to Ben!