Aggiunto pacchetto x webtargets (speriamo sistemi compilazione ed uso su IIS02...)

This commit is contained in:
Samuele E. Locatelli
2017-01-24 11:35:53 +01:00
parent 81d95004ea
commit c61c1c6727
40 changed files with 10615 additions and 407 deletions
@@ -0,0 +1,101 @@
[cmdletbinding(SupportsShouldProcess=$true)]
param($publishProperties, $packOutput, $nugetUrl)
# to learn more about this file visit http://go.microsoft.com/fwlink/?LinkId=524327
$publishModuleVersion = '1.0.1'
function Get-VisualStudio2015InstallPath{
[cmdletbinding()]
param()
process{
$keysToCheck = @('hklm:\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\14.0',
'hklm:\SOFTWARE\Microsoft\VisualStudio\14.0',
'hklm:\SOFTWARE\Wow6432Node\Microsoft\VWDExpress\14.0',
'hklm:\SOFTWARE\Microsoft\VWDExpress\14.0'
)
[string]$vsInstallPath=$null
foreach($keyToCheck in $keysToCheck){
if(Test-Path $keyToCheck){
$vsInstallPath = (Get-itemproperty $keyToCheck -Name InstallDir -ErrorAction SilentlyContinue | select -ExpandProperty InstallDir -ErrorAction SilentlyContinue)
}
if($vsInstallPath){
break;
}
}
$vsInstallPath
}
}
$vsInstallPath = Get-VisualStudio2015InstallPath
$publishModulePath = "{0}Extensions\Microsoft\Web Tools\Publish\Scripts\{1}\" -f $vsInstallPath,'1.0.1'
if(!(Test-Path $publishModulePath)){
$publishModulePath = "{0}VWDExpressExtensions\Microsoft\Web Tools\Publish\Scripts\{1}\" -f $vsInstallPath,'1.0.1'
}
$defaultPublishSettings = New-Object psobject -Property @{
LocalInstallDir = $publishModulePath
}
function Enable-PackageDownloader{
[cmdletbinding()]
param(
$toolsDir = "$env:LOCALAPPDATA\Microsoft\Web Tools\Publish\package-downloader-$publishModuleVersion\",
$pkgDownloaderDownloadUrl = 'http://go.microsoft.com/fwlink/?LinkId=524325') # package-downloader.psm1
process{
if(get-module package-downloader){
remove-module package-downloader | Out-Null
}
if(!(get-module package-downloader)){
if(!(Test-Path $toolsDir)){ New-Item -Path $toolsDir -ItemType Directory -WhatIf:$false }
$expectedPath = (Join-Path ($toolsDir) 'package-downloader.psm1')
if(!(Test-Path $expectedPath)){
'Downloading [{0}] to [{1}]' -f $pkgDownloaderDownloadUrl,$expectedPath | Write-Verbose
(New-Object System.Net.WebClient).DownloadFile($pkgDownloaderDownloadUrl, $expectedPath)
}
if(!$expectedPath){throw ('Unable to download package-downloader.psm1')}
'importing module [{0}]' -f $expectedPath | Write-Output
Import-Module $expectedPath -DisableNameChecking -Force
}
}
}
function Enable-PublishModule{
[cmdletbinding()]
param()
process{
if(get-module publish-module){
remove-module publish-module | Out-Null
}
if(!(get-module publish-module)){
$localpublishmodulepath = Join-Path $defaultPublishSettings.LocalInstallDir 'publish-module.psm1'
if(Test-Path $localpublishmodulepath){
'importing module [publish-module="{0}"] from local install dir' -f $localpublishmodulepath | Write-Verbose
Import-Module $localpublishmodulepath -DisableNameChecking -Force
$true
}
}
}
}
try{
if (!(Enable-PublishModule)){
Enable-PackageDownloader
Enable-NuGetModule -name 'publish-module' -version $publishModuleVersion -nugetUrl $nugetUrl
}
'Calling Publish-AspNet' | Write-Verbose
# call Publish-AspNet to perform the publish operation
Publish-AspNet -publishProperties $publishProperties -packOutput $packOutput
}
catch{
"An error occurred during publish.`n{0}" -f $_.Exception.Message | Write-Error
}
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<WebRoot>wwwroot</WebRoot>
<publishUrl>$(OutDir)\$(Configuration)\PublishOutput</publishUrl>
<DeleteExistingFiles>False</DeleteExistingFiles>
</PropertyGroup>
</Project>
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>Package</WebPublishMethod>
<WebRoot>wwwroot</WebRoot>
<DesktopBuildPackageLocation>$(OutDir)\$(Configuration)\MSDeployPackage\$(MSBuildProjectName).zip</DesktopBuildPackageLocation>
<DeployIisAppPath>Default Web Site</DeployIisAppPath>
</PropertyGroup>
</Project>
@@ -0,0 +1,658 @@
[cmdletbinding(SupportsShouldProcess=$true)]
param()
$script:AspNetPublishHandlers = @{}
$global:AspNetPublishSettings = New-Object -TypeName PSCustomObject @{
MsdeployDefaultProperties = @{
'MSDeployUseChecksum'=$false
'WebRoot'='wwwroot'
'SkipExtraFilesOnServer'=$true
'retryAttempts' = 2
'EnableMSDeployBackup' = $false
'DeleteExistingFiles' = $false
'MSDeployPackageContentFoldername'='website\'
}
}
function Register-AspnetPublishHandler{
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0)]
$name,
[Parameter(Mandatory=$true,Position=1)]
[ScriptBlock]$handler,
[switch]$force
)
process{
if(!($script:AspNetPublishHandlers[$name]) -or $force ){
'Adding handler for [{0}]' -f $name | Write-Verbose
$script:AspNetPublishHandlers[$name] = $handler
}
elseif(!($force)){
'Ignoring call to Register-AspnetPublishHandler for [name={0}], because a handler with that name exists and -force was not passed.' -f $name | Write-Verbose
}
}
}
function Get-AspnetPublishHandler{
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0)]
$name
)
process{
$foundHandler = $script:AspNetPublishHandlers[$name]
if(!$foundHandler){
throw ('AspnetPublishHandler with name "{0}" was not found' -f $name)
}
$foundHandler
}
}
function GetInternal-ExcludeFilesArg{
[cmdletbinding()]
param(
$publishProperties
)
process{
$excludeFiles = $publishProperties['ExcludeFiles']
foreach($exclude in $excludeFiles){
if($exclude){
[string]$objName = $exclude['objectname']
if([string]::IsNullOrEmpty($objName)){
$objName = 'filePath'
}
$excludePath = $exclude['absolutepath']
# output the result to the return list
('-skip:objectName={0},absolutePath={1}' -f $objName, $excludePath)
}
}
}
}
function GetInternal-ReplacementsMSDeployArgs{
[cmdletbinding()]
param(
$publishProperties
)
process{
foreach($replace in ($publishProperties['Replacements'])){
if($replace){
$typeValue = $replace['type']
if(!$typeValue){ $typeValue = 'TextFile' }
$file = $replace['file']
$match = $replace['match']
$newValue = $replace['newValue']
if($file -and $match -and $newValue){
$setParam = ('-setParam:type={0},scope={1},match={2},value={3}' -f $typeValue,$file, $match,$newValue)
'Adding setparam [{0}]' -f $setParam | Write-Verbose
# return it
$setParam
}
else{
'Skipping replacement because its missing a required value.[file="{0}",match="{1}",newValue="{2}"]' -f $file,$match,$newValue | Write-Verbose
}
}
}
}
}
<#
.SYNOPSIS
Returns an array of msdeploy arguments that are used across different providers.
For example this wil handle useChecksum, appOffline, etc.
This will also add default properties if they are missing.
#>
function GetInternal-SharedMSDeployParametersFrom{
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0)]
$publishProperties
)
process{
$sharedArgs = New-Object psobject -Property @{
ExtraArgs = @()
DestFragment = ''
}
# add default properties if they are missing
foreach($propName in $global:AspNetPublishSettings.MsdeployDefaultProperties.Keys){
if($publishProperties["$propName"] -eq $null){
$defValue = $global:AspNetPublishSettings.MsdeployDefaultProperties["$propName"]
'Adding default property to publishProperties ["{0}"="{1}"]' -f $propName,$defValue | Write-Verbose
$publishProperties["$propName"] = $defValue
}
}
if($publishProperties['MSDeployUseChecksum'] -eq $true){
$sharedArgs.ExtraArgs += '-usechecksum'
}
if($publishProperties['WebPublishMethod'] -eq 'MSDeploy'){
$offlineArgs = GetInternal-PublishAppOfflineProperties -publishProperties $publishProperties
$sharedArgs.ExtraArgs += $offlineArgs.AdditionalArguments
$sharedArgs.DestFragment += $offlineArgs.DestFragment
if($publishProperties['SkipExtraFilesOnServer'] -eq $true){
$sharedArgs.ExtraArgs += '-enableRule:DoNotDeleteRule'
}
}
if($publishProperties['WebPublishMethod'] -eq 'FileSystem'){
if($publishProperties['DeleteExistingFiles'] -eq $false){
$sharedArgs.ExtraArgs += '-enableRule:DoNotDeleteRule'
}
}
if($publishProperties['retryAttempts']){
$sharedArgs.ExtraArgs += ('-retryAttempts:{0}' -f ([int]$publishProperties['retryAttempts']))
}
if($publishProperties['EncryptWebConfig'] -eq $true){
$sharedArgs.ExtraArgs += '-EnableRule:EncryptWebConfig'
}
if($publishProperties['EnableMSDeployBackup'] -eq $false){
$sharedArgs.ExtraArgs += '-disablerule:BackupRule'
}
# add excludes
$sharedArgs.ExtraArgs += (GetInternal-ExcludeFilesArg -publishProperties $publishProperties)
# add replacements
$sharedArgs.ExtraArgs += (GetInternal-ReplacementsMSDeployArgs -publishProperties $publishProperties)
# return the args
$sharedArgs
}
}
<#
.SYNOPSIS
This will publish the folder based on the properties in $publishProperties
.EXAMPLE
Publish-AspNet -packOutput $packOutput -publishProperties @{
'WebPublishMethod'='MSDeploy'
'MSDeployServiceURL'='contoso.scm.azurewebsites.net:443';`
'DeployIisAppPath'='contoso';'Username'='$contoso';'Password'="$env:PublishPwd"}
.EXAMPLE
Publish-AspNet -packOutput $packOutput -publishProperties @{
'WebPublishMethod'='FileSystem'
'publishUrl'="$publishDest"
}
.EXAMPLE
Publish-AspNet -packOutput $packOutput -publishProperties @{
'WebPublishMethod'='MSDeploy'
'MSDeployServiceURL'='contoso.scm.azurewebsites.net:443';`
'DeployIisAppPath'='contoso';'Username'='$contoso';'Password'="$env:PublishPwd"
'ExcludeFiles'=@(
@{'absolutepath'='wwwroot\\test.txt'},
@{'absolutepath'='wwwroot\\_references.js'}
)}
.EXAMPLE
Publish-AspNet -packOutput $packOutput -publishProperties @{
'WebPublishMethod'='FileSystem'
'publishUrl'="$publishDest"
'ExcludeFiles'=@(
@{'absolutepath'='wwwroot\\test.txt'},
@{'absolutepath'='wwwroot\\_references.js'})
'Replacements' = @(
@{'file'='test.txt$';'match'='REPLACEME';'newValue'='updatedValue'})
}
Publish-AspNet -packOutput $packOutput -publishProperties @{
'WebPublishMethod'='FileSystem'
'publishUrl'="$publishDest"
'ExcludeFiles'=@(
@{'absolutepath'='wwwroot\\test.txt'},
@{'absolutepath'='c:\\full\\path\\ok\\as\\well\\_references.js'})
'Replacements' = @(
@{'file'='test.txt$';'match'='REPLACEME';'newValue'='updatedValue'})
}
.EXAMPLE
Publish-AspNet -packOutput $packOutput -publishProperties @{
'WebPublishMethod'='FileSystem'
'publishUrl'="$publishDest"
'EnableMSDeployAppOffline'='true'
'AppOfflineTemplate'='offline-template.html'
'MSDeployUseChecksum'='true'
}
#>
function Publish-AspNet{
[cmdletbinding(SupportsShouldProcess=$true)]
param(
[Parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
$publishProperties,
[Parameter(Mandatory = $true,Position=1,ValueFromPipelineByPropertyName=$true)]
$packOutput
)
process{
if($publishProperties['WebPublishMethodOverride']){
'Overriding publish method from $publishProperties[''WebPublishMethodOverride''] to [{0}]' -f ($publishProperties['WebPublishMethodOverride']) | Write-Verbose
$publishProperties['WebPublishMethod'] = $publishProperties['WebPublishMethodOverride']
}
if(!([System.IO.Path]::IsPathRooted($packOutput))){
$packOutput = [System.IO.Path]::GetFullPath((Join-Path $pwd $packOutput))
}
$pubMethod = $publishProperties['WebPublishMethod']
'Publishing with publish method [{0}]' -f $pubMethod | Write-Output
# get the handler based on WebPublishMethod, and call it.
&(Get-AspnetPublishHandler -name $pubMethod) $publishProperties $packOutput
}
}
function Publish-AspNetMSDeploy{
[cmdletbinding(SupportsShouldProcess=$true)]
param(
[Parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
$publishProperties,
[Parameter(Mandatory = $true,Position=1,ValueFromPipelineByPropertyName=$true)]
$packOutput
)
process{
if($publishProperties){
$publishPwd = $publishProperties['Password']
<#
"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe"
-source:IisApp='C:\Users\contoso\AppData\Local\Temp\AspNetPublish\WebApplication1\wwwroot'
-dest:IisApp='vramak4',ComputerName='https://contoso.scm.azurewebsites.net/msdeploy.axd',UserName='$contoso',Password='<PWD>',IncludeAcls='False',AuthType='Basic'
-verb:sync
-enableRule:DoNotDeleteRule
-enableLink:contentLibExtension
-retryAttempts=2
-userAgent="VS14.0:PublishDialog:WTE14.0.51027.0"
#>
$sharedArgs = GetInternal-SharedMSDeployParametersFrom -publishProperties $publishProperties
# WebRoot is a required property which has a default
$webroot = $publishProperties['WebRoot']
$webrootOutputFolder = (get-item (Join-Path $packOutput $webroot)).FullName
$publishArgs = @()
$publishArgs += ('-source:IisApp=''{0}''' -f "$webrootOutputFolder")
$publishArgs += ('-dest:IisApp=''{0}'',ComputerName=''{1}'',UserName=''{2}'',Password=''{3}'',IncludeAcls=''False'',AuthType=''Basic''{4}' -f
$publishProperties['DeployIisAppPath'],
(Get-MSDeployFullUrlFor -msdeployServiceUrl $publishProperties['MSDeployServiceURL']),
$publishProperties['UserName'],
$publishPwd,
$sharedArgs.DestFragment)
$publishArgs += '-verb:sync'
$publishArgs += '-enableLink:contentLibExtension'
$publishArgs += $sharedArgs.ExtraArgs
$command = '"{0}" {1}' -f (Get-MSDeploy),($publishArgs -join ' ')
if (! [String]::IsNullOrEmpty($publishPwd)) {
$command.Replace($publishPwd,'{PASSWORD-REMOVED-FROM-LOG}') | Print-CommandString
}
Execute-Command -exePath (Get-MSDeploy) -arguments ($publishArgs -join ' ')
}
else{
throw 'publishProperties is empty, cannot publish'
}
}
}
function Escape-TextForRegularExpressions{
[cmdletbinding()]
param(
[Parameter(Position=0,Mandatory=$true)]
[string]$text
)
process{
# TODO: Get code from EscapeTextForRegularExpressions task
$text.Replace('\','\\')
}
}
function Publish-AspNetMSDeployPackage{
[cmdletbinding(SupportsShouldProcess=$true)]
param(
[Parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
$publishProperties,
[Parameter(Mandatory = $true,Position=1,ValueFromPipelineByPropertyName=$true)]
$packOutput
)
process{
if($publishProperties){
$packageDestFilepah = $publishProperties['DesktopBuildPackageLocation']
if(!$packageDestFilepah){
throw ('The package destination property (DesktopBuildPackageLocation) was not found in the publish properties')
}
if(!([System.IO.Path]::IsPathRooted($packageDestFilepah))){
$packageDestFilepah = [System.IO.Path]::GetFullPath((Join-Path $pwd $packageDestFilepah))
}
# if the dir doesn't exist create it
$pkgDir = ((new-object -typename System.IO.FileInfo($packageDestFilepah)).Directory)
if(!($pkgDir.Exists)) {
$pkgDir.Create() | Out-Null
}
<#
"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy.exe"
-source:IisApp='C:\Users\contoso\AppData\Local\Temp\AspNetPublish\WebApplication1\wwwroot'
-dest:package=c:\temp\path\contosoweb.zip
-verb:sync
-enableRule:DoNotDeleteRule
-enableLink:contentLibExtension
-retryAttempts=2
#>
$sharedArgs = GetInternal-SharedMSDeployParametersFrom -publishProperties $publishProperties
# WebRoot is a required property which has a default
$webroot = $publishProperties['WebRoot']
$webrootOutputFolder = (get-item (Join-Path $packOutput $webroot)).FullName
$publishArgs = @()
$publishArgs += ('-source:IisApp=''{0}''' -f "$webrootOutputFolder")
$publishArgs += ('-dest:package=''{0}''' -f $packageDestFilepah)
$publishArgs += '-verb:sync'
$publishArgs += '-enableLink:contentLibExtension'
$packageContentFolder = $publishProperties['MSDeployPackageContentFoldername']
if(!$packageContentFolder){ $packageContentFolder = 'website' }
$publishArgs += ('-replace:match=''{0}'',replace=''{1}''' -f (Escape-TextForRegularExpressions $packOutput), $packageContentFolder )
$publishArgs += $sharedArgs.ExtraArgs
$command = '"{0}" {1}' -f (Get-MSDeploy),($publishArgs -join ' ')
$command | Print-CommandString
Execute-Command -exePath (Get-MSDeploy) -arguments ($publishArgs -join ' ')
}
else{
throw 'publishProperties is empty, cannot publish'
}
}
}
<#
.SYNOPSIS
If the passed in $publishProperties has values for appOffline the
needed arguments will be in the return object. If there is no such configuraion
then nothing is returned.
#>
function GetInternal-PublishAppOfflineProperties{
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0)]
$publishProperties
)
process{
$extraArg = '';
$destFragment = ''
if($publishProperties['EnableMSDeployAppOffline'] -eq $true){
$extraArg = '-enablerule:AppOffline'
$appOfflineTemplate = $publishProperties['AppOfflineTemplate']
if($appOfflineTemplate){
$destFragment = (',appOfflineTemplate="{0}"' -f $appOfflineTemplate)
}
}
# return an object with both the properties that need to be in the command.
New-Object psobject -Property @{
AdditionalArguments = $extraArg
DestFragment = $destFragment
}
}
}
function Publish-AspNetFileSystem{
[cmdletbinding(SupportsShouldProcess=$true)]
param(
[Parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
$publishProperties,
[Parameter(Mandatory = $true,Position=1,ValueFromPipelineByPropertyName=$true)]
$packOutput
)
process{
$pubOut = $publishProperties['publishUrl']
if([string]::IsNullOrWhiteSpace($pubOut)){
throw ('publishUrl is a required property for FileSystem publish but it was empty.')
}
# if it's a relative path then update it to a full path
if(!([System.IO.Path]::IsPathRooted($pubOut))){
$pubOut = [System.IO.Path]::GetFullPath((Join-Path $pwd $pubOut))
$publishProperties['publishUrl'] = "$pubOut"
}
'Publishing files to {0}' -f $pubOut | Write-Output
# we use msdeploy.exe because it supports incremental publish/skips/replacements/etc
# msdeploy.exe -verb:sync -source:contentPath='C:\srcpath' -dest:contentPath='c:\destpath'
$sharedArgs = GetInternal-SharedMSDeployParametersFrom -publishProperties $publishProperties
$publishArgs = @()
$publishArgs += ('-source:contentPath=''{0}''' -f "$packOutput")
$publishArgs += ('-dest:contentPath=''{0}''{1}' -f "$pubOut",$sharedArgs.DestFragment)
$publishArgs += '-verb:sync'
$publishArgs += $sharedArgs.ExtraArgs
$command = '"{0}" {1}' -f (Get-MSDeploy),($publishArgs -join ' ')
$command | Print-CommandString
Execute-Command -exePath (Get-MSDeploy) -arguments ($publishArgs -join ' ')
}
}
function Print-CommandString{
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)]
$command
)
process{
'Executing command [{0}]' -f $command | Write-Output
}
}
function Execute-CommandString{
[cmdletbinding()]
param(
[Parameter(Mandatory=$true,Position=0,ValueFromPipeline=$true)]
[string[]]$command,
[switch]
$useInvokeExpression,
[switch]
$ignoreErrors
)
process{
foreach($cmdToExec in $command){
'Executing command [{0}]' -f $cmdToExec | Write-Verbose
if($useInvokeExpression){
try {
Invoke-Expression -Command $cmdToExec
}
catch {
if(-not $ignoreErrors){
$msg = ('The command [{0}] exited with exception [{1}]' -f $cmdToExec, $_.ToString())
throw $msg
}
}
}
else {
cmd.exe /D /C $cmdToExec
if(-not $ignoreErrors -and ($LASTEXITCODE -ne 0)){
$msg = ('The command [{0}] exited with code [{1}]' -f $cmdToExec, $LASTEXITCODE)
throw $msg
}
}
}
}
}
function Execute-Command {
[cmdletbinding()]
param(
[Parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
[String]$exePath,
[Parameter(Mandatory = $true,Position=1,ValueFromPipelineByPropertyName=$true)]
[String]$arguments
)
process{
$psi = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$psi.CreateNoWindow = $true
$psi.UseShellExecute = $false
$psi.RedirectStandardOutput = $true
$psi.RedirectStandardError=$true
$psi.FileName = $exePath
$psi.Arguments = $arguments
$process = New-Object -TypeName System.Diagnostics.Process
$process.StartInfo = $psi
$process.EnableRaisingEvents=$true
# Register the event handler for error
$stdErrEvent = Register-ObjectEvent -InputObject $process -EventName 'ErrorDataReceived' -Action {
if (! [String]::IsNullOrEmpty($EventArgs.Data)) {
$EventArgs.Data | Write-Error
}
}
# Starting process.
[Void]$process.Start()
$process.BeginErrorReadLine()
$output = $process.StandardOutput.ReadToEnd()
[Void]$process.WaitForExit()
$output | Write-Output
# UnRegister the event handler for error
Unregister-Event -SourceIdentifier $stdErrEvent.Name
}
}
function Get-MSDeploy{
[cmdletbinding()]
param()
process{
$installPath = $env:msdeployinstallpath
if(!$installPath){
$keysToCheck = @('hklm:\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\3','hklm:\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\2','hklm:\SOFTWARE\Microsoft\IIS Extensions\MSDeploy\1')
foreach($keyToCheck in $keysToCheck){
if(Test-Path $keyToCheck){
$installPath = (Get-itemproperty $keyToCheck -Name InstallPath -ErrorAction SilentlyContinue | select -ExpandProperty InstallPath -ErrorAction SilentlyContinue)
}
if($installPath){
break;
}
}
}
if(!$installPath){
throw "Unable to find msdeploy.exe, please install it and try again"
}
[string]$msdInstallLoc = (join-path $installPath 'msdeploy.exe')
"Found msdeploy.exe at [{0}]" -f $msdInstallLoc | Write-Verbose
$msdInstallLoc
}
}
function Get-MSDeployFullUrlFor{
[cmdletbinding()]
param($msdeployServiceUrl)
process{
# Convert contoso.scm.azurewebsites.net:443 to https://contoso.scm.azurewebsites.net/msdeploy.axd
# TODO: This needs to be improved, it only works with Azure Websites currently.
'https://{0}/msdeploy.axd' -f $msdeployServiceUrl.TrimEnd(':443')
}
}
function InternalRegister-AspNetKnownPublishHandlers{
[cmdletbinding()]
param()
process{
'Registering MSDeploy handler' | Write-Verbose
Register-AspnetPublishHandler -name 'MSDeploy' -force -handler {
[cmdletbinding()]
param(
[Parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
$publishProperties,
[Parameter(Mandatory = $true,Position=1,ValueFromPipelineByPropertyName=$true)]
$packOutput
)
Publish-AspNetMSDeploy -publishProperties $publishProperties -packOutput $packOutput
}
'Registering MSDeploy package handler' | Write-Verbose
Register-AspnetPublishHandler -name 'Package' -force -handler {
[cmdletbinding()]
param(
[Parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
$publishProperties,
[Parameter(Mandatory = $true,Position=1,ValueFromPipelineByPropertyName=$true)]
$packOutput
)
Publish-AspNetMSDeployPackage -publishProperties $publishProperties -packOutput $packOutput
}
'Registering FileSystem handler' | Write-Verbose
Register-AspnetPublishHandler -name 'FileSystem' -force -handler {
[cmdletbinding()]
param(
[Parameter(Mandatory = $true,Position=0,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
$publishProperties,
[Parameter(Mandatory = $true,Position=1,ValueFromPipelineByPropertyName=$true)]
$packOutput
)
Publish-AspNetFileSystem -publishProperties $publishProperties -packOutput $packOutput
}
}
}
<#
.SYNOPSIS
Used for testing purposes only.
#>
function InternalReset-AspNetPublishHandlers{
[cmdletbinding()]
param()
process{
$script:AspNetPublishHandlers = @{}
InternalRegister-AspNetKnownPublishHandlers
}
}
Export-ModuleMember -function Get-*,Publish-*,Register-*,Enable-*
if($env:IsDeveloperMachine){
# you can set the env var to expose all functions to importer. easy for development.
# this is required for executing pester test cases, it's set by build.ps1
Export-ModuleMember -function *
}
# register the handlers so that Publish-AspNet can be called
InternalRegister-AspNetKnownPublishHandlers