Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save mitchgollub/ebce195ab188c4f4b9f235229e7866e1 to your computer and use it in GitHub Desktop.
Save mitchgollub/ebce195ab188c4f4b9f235229e7866e1 to your computer and use it in GitHub Desktop.
net-core-appsettings-json-variable-replacement-in-appveyor
Write-Host "Environment Variable Substitution"
$variables = gci $env:$env:APPLICATION_PREFIX* | Select-Object -Property Key, Value
$configPath = "$env:APPLICATION_PATH\$env:CONFIG_FILE"
Write-Output "Loading config file from $configPath"
$appSettings = Get-Content -Raw $configPath | ConvertFrom-Json
foreach($variable in $variables) {
$matchString = $variable.Key.replace($env:APPLICATION_PREFIX, "")
$matchProperties = $matchString.Split(".")
if($matchProperties.Count -gt 1) {
$match = $appSettings.($matchProperties[0]).psobject.properties | where { $_.Name -eq $matchProperties[1] }
if ($match) {
$appSettings.($matchProperties[0]).($matchProperties[1]) = $variable.Value
}
else {
Write-Output "Could not find match for $matchString"
}
}
else {
$match = $appSettings.psobject.properties | where { $_.Name -eq $matchString }
if ($match) {
$appSettings.($matchString) = $variable.Value
}
else {
Write-Output "Could not find match for $matchString"
}
}
}
$appSettings | ConvertTo-Json -depth 100 | Out-File $configPath
@mitchgollub
Copy link
Author

Hi @eivindivine
Thanks for your question! If you came here from the blog post (https://mitchgollub.com/net-core-appsettings-json-variable-replacement-in-appveyor/), the directions and details are all there. You can place this code into the deploy.ps1 file at your project root that AppVeyor uses by default. This will execute the powershell script in the context of the deploy agent.

Thank you!

@eivindivine
Copy link

Thanks for your prompt reply @mitchgollub
Your blog is very thorough, but I think I may be missing som preliminary details.

The output log reports 'invalid variable reference':
image

And lets say I have this appsettings.json file, and I want to replace First.Second variable.
image

From your description, I would assume I need one environment variable for APPLICATION_PREFIX for the prefix tekst. and for the following appsettings replacements, I need to start with the prefix and then the variable values?
image

I'm presumably missing som basic info since this doesn't work, or I may have misunderstood your powershell script.

@eivindivine
Copy link

I got it working. I had to separate $env:$env:APPLICATION_PREFIX* into two lines (amongst a few other things).
All together, this is a much smoother solution than the parameters.xml from .net framework. Thanks for the contribution!

@mitchgollub
Copy link
Author

Hi @eivindivine,
That's great news! I was testing it out a little yesterday and had noticed my actual final version of the code is hard-coded with the application prefix

$variables = gci $env:APPID_* | Select-Object -Property Key, Value

So thats my mistake. If you'd like to share your changes, I'd be happy to update this file and credit you.

Also your assumptions on the variable replacement configuration are correct, but you probably knew that already.

Thanks!

@eivindivine
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment