在包管理器控制台中输入的实体框架命令,如Add-Migration
和Update-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文件,并将其保存在&#34; doc&#34;解决方案级别的文件夹。我根据需要从这里复制并粘贴命令,但似乎应该有更好的方法来处理这些命令。
理想情况下,我希望能够创建一个&#34;批处理文件&#34; (或类似的东西),包管理器控制台可以采用简化选项并将其扩展为完整命令。例如,我运行Add-Migration-Ex MyNewMigration
,它会扩展为完整的Add-Migration
命令,并应用当前项目的所有其他标准选项和开关。
有没有更简单的方法来管理这些类型的复杂命令,这使得它们更容易保存并在每个项目/解决方案级别上运行?
答案 0 :(得分:1)
经过大量研究后,我发现NuGet有一个系统可以在解决方案负载下运行power-shell脚本。 Nuget将寻找名为&#34; init.ps1&#34;的脚本。在包装工具&#34;目录,并在解决方案加载时执行它。我将利用这一点,并创建一个在解决方案加载时运行的NuGet包,它将检查名为&#34; SolutionCommands&#34;的解决方案中的目录。然后它将运行任何脚本,并安装位于该目录中的任何模块。这些脚本可以作为Visual Studio中解决方案的一部分进行管理,通过版本控制遵循解决方案,并自动分发给团队中的所有开发人员。
我已经在Nuget上创建了初步package,现在可供其他任何想要此功能的人使用。它还没有真正经过测试,脚本需要在它们运行之前签名(或者计算机的安全策略放松)。
$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