287 строки
12 KiB
PowerShell
287 строки
12 KiB
PowerShell
<#
|
|
.Synopsis
|
|
Create a VS Code AL Project Folder based on a Container
|
|
.Description
|
|
Export all objects from a container, convert them to AL and establish the necessary project files.
|
|
The container needs to be started with -includeAL, which ensures that the .net used by the baseapp are available in a folder.
|
|
.Parameter containerName
|
|
Name of the container from which you want to create the AL Project folder
|
|
.Parameter alProjectFolder
|
|
The alProjectFolder will contain the AL project upon successful completion of this function.
|
|
The content of the folder will be removed.
|
|
This folder doesn't need to be shared with the container, but if you want to use Compile-AppInBcContainer, it might be a good idea to share it.
|
|
.Parameter id
|
|
This parameter specifies the ID of the AL app to be placed in app.json. Default is a new GUID.
|
|
.Parameter name
|
|
This parameter specifies the name of the AL app to be placed in app.json. Default is the container name.
|
|
.Parameter publisher
|
|
This parameter specifies the publisher of the AL app to be placed in app.json. Default is Default Publisher.
|
|
.Parameter version
|
|
This parameter specifies the version of the AL app to be placed in app.json. Default is 1.0.0.0.
|
|
.Parameter addGIT
|
|
Specify
|
|
.Parameter useBaseLine
|
|
Specify this switch if you want to use the AL BaseLine, which was created when creating the container with -includeAL.
|
|
The baseline AL objects are added to "C:\ProgramData\BcContainerHelper\Extensions\Original-<version>-<country>-al" and will contain AL files for the C/AL objects in the container at create time.
|
|
.Parameter alFileStructure
|
|
Specify a function, which will determine the location of the individual al source files
|
|
.Parameter runTxt2AlInContainer
|
|
Specify a foreign container in which you want to run the txt2al tool
|
|
.Parameter useBaseAppProperties
|
|
Specify to retrieve app properties from base app actually installed in container
|
|
.Parameter credential
|
|
Credentials are needed to download the app if you do not use the baseline
|
|
.Example
|
|
$alProjectFolder = "C:\ProgramData\BcContainerHelper\AL\BaseApp"
|
|
Create-AlProjectFolderFromBcContainer -containerName alContainer `
|
|
-alProjectFolder $alProjectFolder `
|
|
-name "myapp" `
|
|
-publisher "Freddy Kristiansen" `
|
|
-version "1.0.0.0" `
|
|
-AddGIT `
|
|
-useBaseLine
|
|
#>
|
|
function Create-AlProjectFolderFromBcContainer {
|
|
Param (
|
|
[string] $containerName = $bcContainerHelperConfig.defaultContainerName,
|
|
[Parameter(Mandatory=$true)]
|
|
[string] $alProjectFolder,
|
|
[string] $id = [GUID]::NewGuid().ToString(),
|
|
[string] $name = $containerName,
|
|
[string] $publisher = "Default Publisher",
|
|
[string] $version = "1.0.0.0",
|
|
[switch] $AddGIT,
|
|
[switch] $useBaseLine,
|
|
[ScriptBlock] $alFileStructure,
|
|
[string] $runTxt2AlInContainer = $containerName,
|
|
[switch] $useBaseAppProperties,
|
|
[PSCredential] $credential = $null
|
|
)
|
|
|
|
$telemetryScope = InitTelemetryScope -name $MyInvocation.InvocationName -parameterValues $PSBoundParameters -includeParameters @()
|
|
try {
|
|
|
|
$navversion = Get-BcContainerNavversion -containerOrImageName $containerName
|
|
$ver = [System.Version]($navversion.split('-')[0])
|
|
$alFolder = Join-Path $bcContainerHelperConfig.hostHelperFolder "Extensions\Original-$navversion-al"
|
|
$dotnetAssembliesFolder = Join-Path $bcContainerHelperConfig.hostHelperFolder "Extensions\$containerName\.netPackages"
|
|
|
|
if (($useBaseLine -and !(Test-Path $alFolder -PathType Container)) -or !(Test-Path $dotnetAssembliesFolder -PathType Container)) {
|
|
throw "Container $containerName was not started with -includeAL (or -doNotExportObjectsAsText was specified)"
|
|
}
|
|
|
|
# Empty Al Project Folder
|
|
if (Test-Path -Path $alProjectFolder -PathType Container) {
|
|
if (Test-Path -Path (Join-Path $alProjectFolder "*")) {
|
|
if (Test-Path -Path (Join-Path $alProjectFolder "app.json")) {
|
|
Remove-Item -Path (Join-Path $alProjectFolder "*") -Recurse -Force
|
|
}
|
|
else {
|
|
throw "The directory '$alProjectFolder' already exists, and it doesn't seem to be an AL project folder, please remove the folder manually."
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
New-Item -Path $AlProjectFolder -ItemType Directory | Out-Null
|
|
}
|
|
|
|
if ($useBaseLine) {
|
|
Copy-AlSourceFiles -Path "$alFolder\*" -Destination $AlProjectFolder -Recurse -alFileStructure $alFileStructure
|
|
}
|
|
elseif ($ver.Major -ge 15) {
|
|
$id = [Guid]::NewGuid().Guid
|
|
$appFile = Join-Path $bcContainerHelperConfig.hostHelperFolder "Extensions\BaseApp-$id.app"
|
|
$appFolder = Join-Path $bcContainerHelperConfig.hostHelperFolder "Extensions\BaseApp-$id"
|
|
$myAlFolder = Join-Path $bcContainerHelperConfig.hostHelperFolder "Extensions\al-$id"
|
|
try {
|
|
$appName = "Base Application"
|
|
if ($ver -lt [Version]("15.0.35659.0")) {
|
|
$appName = "BaseApp"
|
|
}
|
|
$baseapp = Get-BcContainerAppInfo -containerName $containerName | Where-Object { $_.Name -eq $appName }
|
|
Get-BcContainerApp -containerName $containerName `
|
|
-publisher $baseapp.Publisher `
|
|
-appName $baseapp.Name `
|
|
-appVersion $baseapp.Version `
|
|
-appFile $appFile `
|
|
-credential $credential
|
|
|
|
Extract-AppFileToFolder -appFilename $appFile -appFolder $appFolder
|
|
'layout','src','translations' | ForEach-Object {
|
|
if (Test-Path (Join-Path $appFolder $_)) {
|
|
Copy-Item -Path (Join-Path $appFolder $_) -Destination $myAlFolder -Recurse -Force
|
|
}
|
|
}
|
|
|
|
Copy-AlSourceFiles -Path "$myAlFolder\*" -Destination $AlProjectFolder -Recurse -alFileStructure $alFileStructure
|
|
}
|
|
finally {
|
|
Remove-Item -Path $myAlFolder -Recurse -Force -ErrorAction SilentlyContinue
|
|
Remove-Item -Path $appFolder -Recurse -Force -ErrorAction SilentlyContinue
|
|
Remove-Item -Path $appFile -Force -ErrorAction SilentlyContinue
|
|
}
|
|
}
|
|
else {
|
|
Convert-ModifiedObjectsToAl -containerName $containerName -doNotUseDeltas -alProjectFolder $AlProjectFolder -alFileStructure $alFileStructure -runTxt2AlInContainer $runTxt2AlInContainer
|
|
}
|
|
|
|
$appJsonFile = Join-Path $AlProjectFolder "app.json"
|
|
if ($useBaseLine -and $ver -ge [Version]("15.0.35528.0")) {
|
|
$appJson = [System.IO.File]::ReadAllLines("$alFolder\app.json") | ConvertFrom-Json
|
|
|
|
if (-not $useBaseAppProperties) {
|
|
$appJson.Id = $id
|
|
$appJson.Name = $name
|
|
$appJson.Publisher = $publisher
|
|
$appJson.Version = $version
|
|
}
|
|
|
|
if ([bool]($appJson.PSObject.Properties.name -eq "Logo")) {
|
|
try {
|
|
Copy-Item -Path (Join-Path $alFolder $appJson.Logo) -Destination (Join-Path $alProjectFolder $appJson.Logo) -Force
|
|
}
|
|
catch {
|
|
$appJson.Logo = ""
|
|
}
|
|
}
|
|
|
|
} elseif ($ver.Major -ge 15) {
|
|
|
|
if ($useBaseAppProperties) {
|
|
$appName = "Base Application"
|
|
if ($ver -lt [Version]("15.0.35659.0")) {
|
|
$appName = "BaseApp"
|
|
}
|
|
$baseapp = Get-BcContainerAppInfo -containerName $containerName | Where-Object { $_.Name -eq $appName }
|
|
if ($baseapp) {
|
|
$id = $baseapp.AppId
|
|
$name = $baseapp.Name
|
|
$publisher = $baseapp.Publisher
|
|
$version = $baseapp.Version
|
|
}
|
|
else {
|
|
throw "BaseApp not found"
|
|
}
|
|
}
|
|
if ($ver -ge [Version]("15.0.35528.0")) {
|
|
$sysAppVer = "$($ver.Major).0.0.0"
|
|
}
|
|
else {
|
|
$sysAppVer = "1.0.0.0"
|
|
}
|
|
$appJson = @{
|
|
"id" = $id
|
|
"name" = $name
|
|
"publisher" = $publisher
|
|
"version" = $version
|
|
"brief" = ""
|
|
"description" = ""
|
|
"privacyStatement" = ""
|
|
"EULA" = ""
|
|
"help" = ""
|
|
"url" = ""
|
|
"logo" = ""
|
|
"dependencies" = @(@{
|
|
"appId" = "63ca2fa4-4f03-4f2b-a480-172fef340d3f"
|
|
"publisher" = "Microsoft"
|
|
"name" = "System Application"
|
|
"version" = $sysAppVer
|
|
})
|
|
"screenshots" = @()
|
|
"platform" = "$($ver.Major).0.0.0"
|
|
"idRanges" = @()
|
|
"showMyCode" = $true
|
|
"target" = "OnPrem"
|
|
}
|
|
}
|
|
else {
|
|
$appJson = @{
|
|
"id" = $id
|
|
"name" = $name
|
|
"publisher" = $publisher
|
|
"version" = $version
|
|
"brief" = ""
|
|
"description" = ""
|
|
"privacyStatement" = ""
|
|
"EULA" = ""
|
|
"help" = ""
|
|
"url" = ""
|
|
"logo" = ""
|
|
"dependencies" = @()
|
|
"screenshots" = @()
|
|
"platform" = "14.0.0.0"
|
|
"idRanges" = @()
|
|
"showMyCode" = $true
|
|
"target" = "Internal"
|
|
}
|
|
}
|
|
Set-Content -Path $appJsonFile -Value ($appJson | ConvertTo-Json)
|
|
|
|
$dotnetPackagesFolder = Join-Path $AlProjectFolder ".netpackages"
|
|
New-Item -Path $dotnetPackagesFolder -ItemType Directory -Force | Out-Null
|
|
|
|
$alPackagesFolder = Join-Path $AlProjectFolder ".alpackages"
|
|
New-Item -Path $alPackagesFolder -ItemType Directory -Force | Out-Null
|
|
|
|
$vscodeFolder = Join-Path $AlProjectFolder ".vscode"
|
|
New-Item -Path $vscodeFolder -ItemType Directory -Force | Out-Null
|
|
|
|
$settingsJsonFile = Join-Path $vscodeFolder "settings.json"
|
|
$settingsJson = @{
|
|
"al.enableCodeAnalysis" = $false
|
|
"al.enableCodeActions" = $false
|
|
"al.incrementalBuild" = $true
|
|
"al.packageCachePath" = ".alpackages"
|
|
"al.assemblyProbingPaths" = @(".netpackages", $dotnetAssembliesFolder)
|
|
"editor.codeLens" = $false
|
|
}
|
|
Set-Content -Path $settingsJsonFile -Value ($settingsJson | ConvertTo-Json)
|
|
|
|
$launchJsonFile = Join-Path $vscodeFolder "launch.json"
|
|
$config = Get-BcContainerServerConfiguration -ContainerName $containerName
|
|
if ($config.DeveloperServicesSSLEnabled -eq "true") {
|
|
$devserverUrl = "https://$containerName"
|
|
}
|
|
else {
|
|
$devserverUrl = "http://$containerName"
|
|
}
|
|
if ($config.ClientServicesCredentialType -eq "Windows") {
|
|
$authentication = "Windows"
|
|
}
|
|
else {
|
|
$authentication = "UserPassword"
|
|
}
|
|
$launchJson = @{
|
|
"version" = "0.2.0"
|
|
"configurations" = @( @{
|
|
"type" = "al"
|
|
"request" = "launch"
|
|
"name" = "$containerName"
|
|
"server" = $devserverUrl
|
|
"port" = [int]($config.DeveloperServicesPort)
|
|
"serverInstance" = $config.ServerInstance
|
|
"authentication" = $authentication
|
|
"breakOnError" = $true
|
|
"launchBrowser" = $true
|
|
} )
|
|
}
|
|
Set-Content -Path $launchJsonFile -Value ($launchJson | ConvertTo-Json)
|
|
|
|
if ($addGit) {
|
|
Add-GitToAlProjectFolder -alProjectFolder $alProjectFolder -commitMessage $containerName
|
|
}
|
|
|
|
Write-Host -ForegroundColor Green "Al Project Folder Created"
|
|
}
|
|
catch {
|
|
TrackException -telemetryScope $telemetryScope -errorRecord $_
|
|
throw
|
|
}
|
|
finally {
|
|
TrackTrace -telemetryScope $telemetryScope
|
|
}
|
|
}
|
|
Set-Alias -Name Create-AlProjectFolderFromNavContainer -Value Create-AlProjectFolderFromBcContainer
|
|
Export-ModuleMember -Function Create-AlProjectFolderFromBcContainer -Alias Create-AlProjectFolderFromNavContainer
|
|
|