ASP.NET 5 MVC 6:Publish-AzureWebsiteProject不正确的目录结构

时间:2015-09-16 16:00:43

标签: powershell azure asp.net-core asp.net-core-mvc azure-powershell

使用PowerShell将ASP.NET 5 MVC 6应用程序发布到Azure Web App时,似乎发布的文件夹结构在某种程度上是不正确的。

发布后,wwwroot是一个文件夹太深:

wwwroot dir

如果我将应用程序的虚拟目录从site\wwwroot更改为site\wwwroot\wwwroot,那么它可以正常工作!

首先,我使用MSBuild构建并发布文件:

/t:Build,FileSystemPublish /p:PublishConfiguration=$(BuildConfiguration) /p:PublishOutputPathNoTrailingSlash=$(build.stagingDirectory)

第二次,使用此脚本发布到Azure Web App并将$(build.stagingDirectory)作为$packOutput传递:

param([String] [Parameter(Mandatory = $true)]$websiteName, [String] [Parameter(Mandatory = $true)]$packOutput)

$SourceFolder    = "$packOutput"
[IO.DirectoryInfo] $parentDir = [System.IO.Path]::GetDirectoryName($packOutput)
$DestinationFile = "$parentDir\Publish.zip"
$Compression     = "Optimal"  # Optimal, Fastest, NoCompression

function Zip-Directory {
    Param(
      [Parameter(Mandatory=$True)][string]$DestinationFileName,
      [Parameter(Mandatory=$True)][string]$SourceDirectory = "",
      [Parameter(Mandatory=$False)][string]$CompressionLevel = "Optimal",
      [Parameter(Mandatory=$False)][switch]$IncludeParentDir
    )
    Add-Type -AssemblyName System.IO.Compression.FileSystem
    $CompressionLevel    = [System.IO.Compression.CompressionLevel]::$CompressionLevel  
    [System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectory, $DestinationFileName, $CompressionLevel, $IncludeParentDir)
}

Zip-Directory -DestinationFileName $DestinationFile `
    -SourceDirectory $SourceFolder `
    -CompressionLevel $Compression ` #Optional parameter

Move-Item -Path $DestinationFile -Destination $SourceFolder\Publish.zip

Write-Output "Stopping web app..."
Stop-AzureWebsite -Name $websiteName

Write-Output "Publishing web app..."
Publish-AzureWebsiteProject -Name $websiteName -Package $SourceFolder\Publish.zip

Write-Output "Starting web app..."
Start-AzureWebsite -Name $websiteName

我似乎无法看到这一切都出错了。

修改:使用DNX beta6

2 个答案:

答案 0 :(得分:2)

问题是您的 Publish.zip 文件夹将包含两个子文件夹。如果您使用.NET 5附带的新dnu publish命令,也会出现这种情况。

approot
wwwroot

Publish-AzureWebsiteProject Publish.zip 的内容发布到Azure Web App的site/wwwroot。您需要的是一种发布方法,该方法不会发布到site/wwwroot,而是发布到/site,因此您在Azure Web App中以以下目录结构结束。

D:\
  home 
    site
      approot
      wwwroot

另一种方法是使用GitFTP而不是Publish-AzureWebsiteProject推送到Azure Web App。两者都为您提供所需的控件,并且您同时使用PowerShell。如果您选择Git路线,虽然它可以开箱即用,但也可以查看Project Kudu

Push with Git

答案 1 :(得分:1)

site\wwwroot to site\wwwroot\wwwroot更改应用程序的虚拟目录只能工作一次。下次部署后,您应用的wwwroot文件夹将位于

 site
  wwwroot
   wwwroot
    wwwroot

因此,您必须将应用程序的虚拟目录更改为site\wwwroot\wwwroot\wwwroot才能在浏览器中获得任何结果。每个后续部署都会重复此过程。您可以通过向azure网站添加额外的虚拟目录来防止这种情况。 如果是API,它将如下所示:

/    site\wwwroot
/api site\wwwroot\wwwroot

Publish-AzureWebsiteProject将继续部署到site \ wwwroot,您可以在浏览器中访问:some.com/api