【问题标题】:Managing Package Manager Console commands for Entity Framework in project在项目中管理实体框架的包管理器控制台命令
【发布时间】:2017-10-03 15:10:39
【问题描述】:

在处理具有“非标准”构建的解决方案时,在包管理器控制台中输入的实体框架命令(如 Add-MigrationUpdate-Database)可能会变得相当长且复杂。

使用如下语法和选项:

Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] 
  [-ConfigurationTypeName <String>] [-ConnectionStringName <String>] [-IgnoreChanges] 
  [-AppDomainBaseDirectory <String>] [<CommonParameters>]

Add-Migration [-Name] <String> [-Force] [-ProjectName <String>] [-StartUpProjectName <String>] 
  [-ConfigurationTypeName <String>] -ConnectionString <String> -ConnectionProviderName <String> 
  [-IgnoreChanges] [-AppDomainBaseDirectory <String>] [<CommonParameters>]

Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] 
  [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] 
  [-ConnectionStringName <String>] [-AppDomainBaseDirectory <String>] [<CommonParameters>]

Update-Database [-SourceMigration <String>] [-TargetMigration <String>] [-Script] [-Force] 
  [-ProjectName <String>] [-StartUpProjectName <String>] [-ConfigurationTypeName <String>] 
  -ConnectionString <String> -ConnectionProviderName <String> 
  [-AppDomainBaseDirectory <String>] [<CommonParameters>]

在项目中管理这些命令有什么好的选择吗?我经常发现自己创建了一个带有注释和已保存命令行的 .txt 文件,并将其保存在解决方案级别的“doc”文件夹中。我根据需要从这里复制和粘贴命令,但似乎应该有更好的方法来处理这些命令。

理想情况下,我希望能够为包管理器控制台创建一个“批处理文件”(或类似的东西),它可以采用简化的选项并将其扩展为完整的命令。例如,我运行 Add-Migration-Ex MyNewMigration,它被扩展为完整的 Add-Migration 命令,并应用了当前项目的所有其他标准选项和开关。

有没有更简单的方法来管理这些类型的复杂命令,使它们更容易在每个项目/解决方案级别上保存和运行?

【问题讨论】:

  • Set-Alias怎么样?
  • @DavidG 这是否允许我扩展命令以包含最初未指定的参数?我在文档中看不到任何看起来像的东西。另外,我将如何运行该命令来创建别名?我每次打开解决方案时都不必手动输入Set-Alias ..blah blah 吗?是否有一些等效于我可以放置在解决方案中的“启动”脚本在打开时运行?
  • 与使用 Set-Alias 类似,但如果您将命令添加到 NuGet_profile.ps1,则可以将一些更深入的逻辑写入您的命令。这个链接有一些例子可以给你一些启发。 pongit.be/productivity/package-manager-console-ef-migrations
  • @BradleyUffner 那将是一个好主意,遗憾的是我不知道如何做到这一点。似乎您应该能够将 .ps1 脚本添加到您的解决方案中,并让 nuget 包管理器使用相对路径在加载时运行 Import-Module。实际上,这可能值得提出一个新问题。
  • 看起来配置文件脚本是在当前目录设置为当前解决方案的目录的情况下运行的,所以我可以让我的配置文件搜索类似“pmc.startup.ps1”的内容并在以下情况下执行它找到了。

标签: c# entity-framework nuget


【解决方案1】:

经过大量研究,我发现 NuGet 有一个系统可以在加载解决方案时运行 power-shell 脚本。 Nuget 将在包的“工具”目录中查找名为“init.ps1”的脚本,并在解决方案加载时执行它。我将利用这一点,并创建一个在解决方案加载时运行的 NuGet 包,它将检查解决方案中名为“SolutionCommands”的目录。然后它将运行任何脚本,并安装位于该目录中的任何模块。这些脚本可以作为解决方案的一部分在 Visual Studio 中进行管理,通过版本控制跟踪解决方案,并自动分发给团队中的所有开发人员。

我创建了初步的package,现在可以在 Nuget 上为任何想要此功能的其他人使用。它还没有真正经过测试,脚本需要签名(或放松计算机的安全策略)才能运行。


init.ps1:

$oldLocation = Get-Location

$oldWarningPref = $WarningPreference
$WarningPreference = 'SilentlyContinue'

$commandDirectory = ".\SolutionCommands"

If(Test-Path $commandDirectory)
{
    Write-Host "Installing Modules..."
    Get-ChildItem $commandDirectory -Filter "*.psm1" |
    ForEach-Object {
        $fullPath = Join-Path -Path $commandDirectory -ChildPath $_.Name
        $fileName = Split-Path -Path $fullPath -Leaf
        $fileNameNoExtension = [System.IO.Path]::GetFileNameWithoutExtension($fullPath)

        if (Get-Module | ?{ $_.Name -eq $fileNameNoExtension })
        {
            Remove-Module $fileNameNoExtension
        }
        Import-Module ($fullPath)

        Write-Host "Loaded module: " $fullPath
        Write-Host "      Commands: " (Get-Command -Module $fileNameNoExtension)
        Write-Host
    }

    Write-Host "Executing Scripts..."
    Get-ChildItem $commandDirectory -Filter "*.ps1" |
    ForEach-Object {
        $fullPath = Join-Path -Path $commandDirectory -ChildPath $_.Name
        Write-Host $fullPath
        . $fullPath
    }
}

Set-Location $oldLocation
$WarningPref = $oldWarningPref

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-18
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    相关资源
    最近更新 更多