Aggiunto pacchetto x webtargets (speriamo sistemi compilazione ed uso su IIS02...)
This commit is contained in:
+101
@@ -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
|
||||
}
|
||||
+13
@@ -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>
|
||||
+13
@@ -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>
|
||||
+658
@@ -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
|
||||
Reference in New Issue
Block a user