diff --git a/appveyor.yml b/appveyor.yml index c3ea417..95fdce7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 1.3.2.{build} +version: 1.3.3.{build} cache: - tools -> build.cake diff --git a/sample/ProjectExample/DbMigrationsNet6/DbMigrationsNet6.csproj b/sample/ProjectExample/DbMigrationsNet6/DbMigrationsNet6.csproj index 41baf9d..addc29d 100644 --- a/sample/ProjectExample/DbMigrationsNet6/DbMigrationsNet6.csproj +++ b/sample/ProjectExample/DbMigrationsNet6/DbMigrationsNet6.csproj @@ -15,19 +15,4 @@ - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - diff --git a/sample/ProjectExample/DbMigrationsNet6/migrations.json b/sample/ProjectExample/DbMigrationsNet6/migrations.json index bb0368c..d482349 100644 --- a/sample/ProjectExample/DbMigrationsNet6/migrations.json +++ b/sample/ProjectExample/DbMigrationsNet6/migrations.json @@ -1,5 +1,5 @@ { - "ConnectionProjectName": "ConsoleApp", + "ConnectionProjectName": "WebApplicationNet6", "ConnectionName": "TestDb", "FluentMigrationToolPath": "%USERPROFILE%\\.nuget\\packages\\fluentmigrator.console\\3.3.2\\net461\\any\\Migrate.exe", "DbProvider": "SqlServer", diff --git a/sample/ProjectExample/ManuallTests.md b/sample/ProjectExample/ManuallTests.md index 6c7ed52..1ef7933 100644 --- a/sample/ProjectExample/ManuallTests.md +++ b/sample/ProjectExample/ManuallTests.md @@ -10,7 +10,7 @@ Import-Module ..\..\src\Alt.FluentMigrator.VStudio.psm1 -Force Find-Package Alt.FluentMigrator.VStudio Uninstall-Package Alt.FluentMigrator.VStudio -verbose Install-Package Alt.FluentMigrator.VStudio -verbose -Install-Package Alt.FluentMigrator.VStudio -Source LocalSource -Version 1.3.2 -verbose +Install-Package Alt.FluentMigrator.VStudio -Source LocalSource -Version 1.3.3 -verbose ``` diff --git a/sample/ProjectExample/ProjectExample.sln b/sample/ProjectExample/ProjectExample.sln index 5077c84..3091680 100644 --- a/sample/ProjectExample/ProjectExample.sln +++ b/sample/ProjectExample/ProjectExample.sln @@ -13,9 +13,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ConsoleApp", "ConsoleApp\Co EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbMigrationsNetFramework48", "DbMigrationsNetFramework48\DbMigrationsNetFramework48.csproj", "{FB887B25-741F-43CE-A96E-F50D072E1754}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbMigrationsNet31", "DbMigrationsNet31\DbMigrationsNet31.csproj", "{0E5D4059-0B0A-4AE0-B2E7-EE5432C21844}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DbMigrationsNet31", "DbMigrationsNet31\DbMigrationsNet31.csproj", "{0E5D4059-0B0A-4AE0-B2E7-EE5432C21844}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DbMigrationsNet6", "DbMigrationsNet6\DbMigrationsNet6.csproj", "{280229EE-A160-404E-8F27-78D1D100DCB9}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DbMigrationsNet6", "DbMigrationsNet6\DbMigrationsNet6.csproj", "{280229EE-A160-404E-8F27-78D1D100DCB9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApplicationNet6", "WebApplicationNet6\WebApplicationNet6.csproj", "{A67D7B67-6F43-403F-B096-CE046E0EAF2A}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,6 +41,10 @@ Global {280229EE-A160-404E-8F27-78D1D100DCB9}.Debug|Any CPU.Build.0 = Debug|Any CPU {280229EE-A160-404E-8F27-78D1D100DCB9}.Release|Any CPU.ActiveCfg = Release|Any CPU {280229EE-A160-404E-8F27-78D1D100DCB9}.Release|Any CPU.Build.0 = Release|Any CPU + {A67D7B67-6F43-403F-B096-CE046E0EAF2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A67D7B67-6F43-403F-B096-CE046E0EAF2A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A67D7B67-6F43-403F-B096-CE046E0EAF2A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A67D7B67-6F43-403F-B096-CE046E0EAF2A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/sample/ProjectExample/WebApplicationNet6/Program.cs b/sample/ProjectExample/WebApplicationNet6/Program.cs new file mode 100644 index 0000000..79af670 --- /dev/null +++ b/sample/ProjectExample/WebApplicationNet6/Program.cs @@ -0,0 +1,6 @@ +var builder = WebApplication.CreateBuilder(args); +var app = builder.Build(); + +app.MapGet("/items", () => "Hello world"); + +app.Run(); diff --git a/sample/ProjectExample/WebApplicationNet6/Properties/launchSettings.json b/sample/ProjectExample/WebApplicationNet6/Properties/launchSettings.json new file mode 100644 index 0000000..4d2e2d6 --- /dev/null +++ b/sample/ProjectExample/WebApplicationNet6/Properties/launchSettings.json @@ -0,0 +1,28 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:61753", + "sslPort": 44393 + } + }, + "profiles": { + "WebApplicationNet6": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7282;http://localhost:5282", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/sample/ProjectExample/WebApplicationNet6/WebApplicationNet6.csproj b/sample/ProjectExample/WebApplicationNet6/WebApplicationNet6.csproj new file mode 100644 index 0000000..3eef2ad --- /dev/null +++ b/sample/ProjectExample/WebApplicationNet6/WebApplicationNet6.csproj @@ -0,0 +1,13 @@ + + + + net6.0 + enable + enable + + + + + + + diff --git a/sample/ProjectExample/WebApplicationNet6/appsettings.Development.json b/sample/ProjectExample/WebApplicationNet6/appsettings.Development.json new file mode 100644 index 0000000..0c208ae --- /dev/null +++ b/sample/ProjectExample/WebApplicationNet6/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/sample/ProjectExample/WebApplicationNet6/appsettings.json b/sample/ProjectExample/WebApplicationNet6/appsettings.json new file mode 100644 index 0000000..07eaa71 --- /dev/null +++ b/sample/ProjectExample/WebApplicationNet6/appsettings.json @@ -0,0 +1,12 @@ +{ + "ConnectionStrings": { + "TestDb": "server=localhost\\SQLEXPRESS; database=TestDb; Integrated Security=SSPI" + }, + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} diff --git a/src/Alt.FluentMigrator.VStudio.nuspec b/src/Alt.FluentMigrator.VStudio.nuspec index db56365..68aea31 100644 --- a/src/Alt.FluentMigrator.VStudio.nuspec +++ b/src/Alt.FluentMigrator.VStudio.nuspec @@ -2,7 +2,7 @@ Alt.FluentMigrator.VStudio - 1.3.2 + 1.3.3 Volodymyr Liashenko https://github.com/crimcol/Alt.FluentMigrator.VStudio MIT diff --git a/src/Alt.FluentMigrator.VStudio.psm1 b/src/Alt.FluentMigrator.VStudio.psm1 index b2d985a..bc8d972 100644 --- a/src/Alt.FluentMigrator.VStudio.psm1 +++ b/src/Alt.FluentMigrator.VStudio.psm1 @@ -14,8 +14,81 @@ function GetMigrationSettings($projectName) return $migrationSettings } -function GetProjectProperties($projectName) +function ReadConnectionString { + [CmdletBinding()] + param($connectionStringPath, $connectionName) + + if ([string]::IsNullOrEmpty($connectionProject.ConfigFilePath)) + { + Write-Error -Message "Config file path is empty." -ErrorAction Stop + } + + $connectionString = "" + try { + $connectionString = ReadConnectionStringFromJsonConfig $connectionStringPath $connectionName + } + catch { + Write-Verbose "probably it is not a json file" + Write-Verbose $_ + } + + if ([string]::IsNullOrEmpty($connectionString)) + { + $connectionString = ReadConnectionStringFromXmlConfig $connectionStringPath $connectionName + } + else + { + return $connectionString + } + + if ([string]::IsNullOrEmpty($connectionString)) + { + Write-Error -Message "ConnectionString '$($connectionName)' not found in file '$($connectionStringPath)'." -ErrorAction Stop + } + + return $connectionString +} + +function ReadConnectionStringFromJsonConfig +{ + [CmdletBinding()] + param($connectionStringPath, $connectionName) + + Write-Verbose "Read connection string from JSON config: $connectionStringPath" + $json = Get-Content -Path $connectionStringPath | ConvertFrom-Json + $connectionStrings = $json.ConnectionStrings + + foreach($item in $connectionStrings.PSObject.Properties){ + if($item.Name -match $connectionName){ + return $item.Value + }else{ + Write-Verbose "Skip connection string $($item.Name) : $($item.Value)" + } + } +} + +function ReadConnectionStringFromXmlConfig +{ + [CmdletBinding()] + param($connectionStringPath, $connectionName) + + Write-Verbose "Read connection string from XML config: $connectionStringPath" + $cfg = [xml](Get-Content -Path $connectionStringPath) + $connectionStrings = $cfg.SelectNodes("//connectionStrings/add") + foreach($cs in $connectionStrings){ + if($cs.name -match $connectionName){ + return $cs.connectionString + }else{ + Write-Verbose "Skip connection string $($cs.name) : $($cs.connectionString)" + } + } +} + +function GetProjectProperties +{ + [CmdletBinding()] + param($projectName) $p = GetProject $projectName $fullPath = Split-Path -Path $p.FullName @@ -24,6 +97,17 @@ function GetProjectProperties($projectName) $outputFullPath = [IO.Path]::Combine($fullPath, $outputPath) $outputFileFullPath = [IO.Path]::Combine($outputFullPath, $outputFileName) $configFilePath = $outputFileFullPath + ".config" + + if (-not(Test-Path $configFilePath)) + { + $prevConfigPath = $configFilePath + $configFilePath = [IO.Path]::Combine($outputFullPath, "appsettings.json") + if (-not(Test-Path $configFilePath)) + { + Write-Verbose -Message "Config file was not found:`r`n$($prevConfigPath)`r`n$($configFilePath)" + $configFilePath = "" + } + } $properties = @{ Name = $p.Name @@ -41,19 +125,23 @@ function GetProjectProperties($projectName) return $o } -function Update-FluentDatabase([String]$ProjectName, [Int] $Timeout = 30) +function Update-FluentDatabase { + [CmdletBinding()] + param ([String]$ProjectName, [Int] $Timeout = 30) + $migrationProject = GetProjectProperties $ProjectName FluentBuild $migrationProject.Project $migrationSettings = GetMigrationSettings $migrationProject.Name $connectionProject = GetProjectProperties $migrationSettings.ConnectionProjectName + $connectionString = ReadConnectionString $connectionProject.ConfigFilePath $migrationSettings.ConnectionName $params = @( "-t:migrate", "-db $($migrationSettings.DbProvider)", - "-configPath ""$($connectionProject.ConfigFilePath)""", - "-c ""$($migrationSettings.ConnectionName)""", + #"-configPath ""$($connectionProject.ConfigFilePath)""", + "-c ""$($connectionString)""", "-a ""$($migrationProject.OutputFileFullPath)""", "-wd ""$($migrationProject.OutputFullPath)""", "-timeout $($Timeout)", @@ -77,13 +165,14 @@ function Rollback-FluentDatabase $migrationSettings = GetMigrationSettings $migrationProject.Name $connectionProject = GetProjectProperties $migrationSettings.ConnectionProjectName + $connectionString = ReadConnectionString $connectionProject.ConfigFilePath $migrationSettings.ConnectionName $params = @( "-t rollback:toversion", "-version $MigrationNumber", "-db $($migrationSettings.DbProvider)", - "-configPath ""$($connectionProject.ConfigFilePath)""", - "-c ""$($migrationSettings.ConnectionName)""", + #"-configPath ""$($connectionProject.ConfigFilePath)""", + "-c ""$($connectionString)""", "-a ""$($migrationProject.OutputFileFullPath)""", "-wd ""$($migrationProject.OutputFullPath)""", "-timeout $($Timeout)")