Skip to content

Commit

Permalink
update default SqlPackage version
Browse files Browse the repository at this point in the history
This updates the default version of SqlPackage that d365fo.tools installs to 162.2.111.2 (the first .NET 8 version).

In addition, it replaces the -SkipExtractFromPage parameter and the corresponding web scraping logic with the -Latest parameter and the evergreen link https://aka.ms/sqlpackage-windows

Note that unlike the behavior from when the web scraping logic was still working, the latest version of SqlPackage is NOT installed by default. Instead, the fixed version 162.2.111.2 is installed (which may be updated to later versions in the future). Reasons for this change in behavior are discussed in d365collaborative#747.

fixes d365collaborative#747
  • Loading branch information
FH-Inway committed May 1, 2024
1 parent 827c4a3 commit 49467d3
Showing 1 changed file with 34 additions and 37 deletions.
71 changes: 34 additions & 37 deletions d365fo.tools/functions/invoke-d365installsqlpackage.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -4,84 +4,75 @@
Download SqlPackage.exe to your machine
.DESCRIPTION
Download and extract the DotNet/.NET core x64 edition of the SqlPackage.exe to your machine
It parses the raw html page and tries to extract the latest download link.
As of 12th April 2022, no .NET Core link is available on the download page. The cmdlet will always use the Url parameter.
Download and extract SqlPackage.exe to your machine.
.PARAMETER Path
Path to where you want the SqlPackage to be extracted to
Default value is: "C:\temp\d365fo.tools\SqlPackage\SqlPackage.exe"
.PARAMETER SkipExtractFromPage
Instruct the cmdlet to skip trying to parse the download page and to rely on the Url parameter only
.PARAMETER Latest
Overrides the Url parameter and uses the latest download URL provided by the evergreen link https://aka.ms/sqlpackage-windows
.PARAMETER Url
Url/Uri to where the latest SqlPackage download is located
Url/Uri to where the SqlPackage download is located
The default value is for v19.1 (16.0.6161.0) as of writing. This is the last version of SqlPackage based on .NET Core.
According to the Microsoft documentation, a .NET Core version of SqlPackage should be used.
https://learn.microsoft.com/en-us/dynamics365/fin-ops-core/dev-itpro/database/import-database
Further discussion can be found here: https://github.com/d365collaborative/d365fo.tools/issues/708
The default value is for version 162.2.111.2 as of writing.
Further discussion can be found here: https://github.com/d365collaborative/d365fo.tools/discussions/816
.EXAMPLE
PS C:\> Invoke-D365InstallSqlPackage
This will download and extract the latest SqlPackage.exe.
This will download and extract SqlPackage.exe.
It will use the default value for the Path parameter, for where to save the SqlPackage.exe.
It will try to extract the latest download URL from the RAW html page.
It will update the path for the SqlPackage.exe in configuration.
.EXAMPLE
PS C:\> Invoke-D365InstallSqlPackage -Path "C:\temp\SqlPackage"
This will download and extract the latest SqlPackage.exe.
It will try to extract the latest download URL from the RAW html page.
This will download and extract SqlPackage.exe.
It will save the SqlPackage.exe to "C:\temp\SqlPackage".
It will update the path for the SqlPackage.exe in configuration.
.EXAMPLE
PS C:\> Invoke-D365InstallSqlPackage -SkipExtractFromPage
PS C:\> Invoke-D365InstallSqlPackage -Latest
This will download and extract the latest SqlPackage.exe.
It will rely on the Url parameter to based the download from.
It will use the default value of the Url parameter.
It will use https://aka.ms/sqlpackage-windows as the download URL.
It will update the path for the SqlPackage.exe in configuration.
.EXAMPLE
PS C:\> Invoke-D365InstallSqlPackage -SkipExtractFromPage -Url "https://go.microsoft.com/fwlink/?linkid=3030303"
PS C:\> Invoke-D365InstallSqlPackage -Url "https://go.microsoft.com/fwlink/?linkid=3030303"
This will download and extract the latest SqlPackage.exe.
It will rely on the Url parameter to based the download from.
This will download and extract SqlPackage.exe.
It will rely on the Url parameter to base the download on.
It will use the "https://go.microsoft.com/fwlink/?linkid=3030303" as value for the Url parameter.
It will update the path for the SqlPackage.exe in configuration.
.NOTES
Author: Mötz Jensen (@Splaxi)
Author: Florian Hopfner (@FH-Inway)
#>

function Invoke-D365InstallSqlPackage {
[Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseShouldProcessForStateChangingFunctions", "")]
[CmdletBinding()]
[CmdletBinding(DefaultParameterSetName = 'ImportUrl')]
[OutputType()]
param (
[Parameter(ParameterSetName = 'ImportUrl')]
[Parameter(ParameterSetName = 'ImportLatest')]
[string] $Path = "C:\temp\d365fo.tools\SqlPackage",

[switch] $SkipExtractFromPage,

[string] $Url = "https://go.microsoft.com/fwlink/?linkid=2196334"

[Parameter(ParameterSetName = 'ImportLatest')]
[switch] $Latest,

[Parameter(ParameterSetName = 'ImportUrl')]
[string] $Url = "https://go.microsoft.com/fwlink/?linkid=2261576"
)

if (-not $SkipExtractFromPage) {
$content = (Invoke-WebRequest -Uri "https://learn.microsoft.com/en-us/sql/tools/sqlpackage-download" -UseBasicParsing).content
$res = $content -match '<td.*>Windows .NET Core<.*/td>\s*<td.*><a href="(https://.*)" .*'

if ($res) {
$Url = ([string]$Matches[1]).Trim()
}
else {
Write-PSFMessage -Level Host -Message "Parsing the web page didn't succeed. Will fall back to the download url." -Target "https://learn.microsoft.com/en-us/sql/tools/sqlpackage-download"
}
if ($Latest) {
$Url = "https://aka.ms/sqlpackage-windows"
}

$sqlPackageFolder = $Path
Expand All @@ -107,5 +98,11 @@ function Invoke-D365InstallSqlPackage {
$tempExtractPath | Remove-Item -Force -Recurse
$downloadPath | Remove-Item -Force -Recurse

Set-D365SqlPackagePath -Path $(Join-Path -Path $Path -ChildPath "SqlPackage.exe")
$SqlPackagePath = Join-Path -Path $Path -ChildPath "SqlPackage.exe"
Set-D365SqlPackagePath -Path $SqlPackagePath

$result = Invoke-Process -Path $SqlPackagePath -Params "/Version"
$version = $result.stdout -replace "`r`n", ""

Write-PSFMessage -Level Host -Message "SqlPackage.exe version $version has been downloaded and extracted to $SqlPackagePath"
}

0 comments on commit 49467d3

Please sign in to comment.