使用IIS托管/调试功能自动设置Asp.net Core开发人员环境

时间:2019-07-09 13:55:47

标签: powershell asp.net-core iis .net-core

我有一个Powershell脚本,该脚本可以在开发人员机器上构建和设置多个Web应用程序。当初次设置开发环境或开发人员只想获取所有内容的最新版本并在其计算机上可用时,将使用此功能。通常可以在一个特定的应用程序上运行,但由于所有其他应用程序都可以彼此提供服务,因此它们可以同时使用。

对于“旧” Asp.net应用程序,这就像构建.csproj并将本地IIS上的站点指向适当的文件夹一样简单。

对于我们新的.Net Core应用程序,它看起来就像一阵子一样简单。该脚本使用Msbuild构建了适当的.csproj,并使用Powershell创建并配置了指向项目目录的AppPool和IIS站点。 web.config文件包含<aspNetCore processPath="bin\IISSupport\VSIISExeLauncher.exe" arguments="-argFile IISExeLauncherArgs.txt" />,以启用IIS托管和调试。

此方法适用于已经运行了有关.net Core应用程序的计算机。但是,事实证明bin\IISSupport\VSIISExeLauncher.exe不是在MsBuild的构建过程中创建的,而是在Visual Studio中首次启动该应用程序时创建的。这意味着,即使一切都已正确设置,新开发人员仍必须手动打开每个解决方案,并从Visual Studio中手动启动每个已安装的应用程序,以正确,完整地设置其环境。

有人自动化过这个过程吗?

我知道直接在本地IIS服务器上开发.Net Core应用程序不是“首选”方案,但是自动安装和运行构成SOA一部分的多个Web应用程序似乎是合理的。

最后但并非最不重要的一点,我想指出的是,我们正在尝试建立一个 development 环境,在该环境中开发人员应该能够在Visual Studio中打开解决方案并且它包含的应用程序可以在本地IIS上调试。因此,仅将应用程序发布到本地站点并不是理想的解决方案。

1 个答案:

答案 0 :(得分:0)

我一直在寻找类似的东西,最终写了一个脚本(如下)来生成所需的文件。它具有非常基本的.csproj文件支持,因此,如果它不起作用,则可以提供指向-WorkingDirectory-AssemblyPath参数的绝对路径。它设置了在不首先打开Visual Studio的情况下运行站点所需的最低限度的参数。一旦有人在Visual Studio中构建/开始调试,文件将被覆盖,调试将按预期进行。

这使用VSSetup PowerShell模块自动检测您安装的Visual Studio版本(适用于2017或更高版本)。

VSIISExeLauncher匀场脚本:

# This utilizes https://github.com/microsoft/vssetup.powershell
# Quick setup:  Install-Module VSSetup -Scope CurrentUser

param(
    [string] $WorkingDirectory = "",
    [string] $AssemblyPath = "",
    [string] $ProjectPath = "",
    [string] $Build = "Debug"
)
$ErrorActionPreference = "Stop"

# Check that at parameter requirements are met
if ((-not $WorkingDirectory -and -not $ProjectPath) -or (-not $AssemblyPath -and -not $ProjectPath)) {
    throw "Please specify the working directory and assembly path, or the project file name"
}

# Get assembly path and working directory information using .csproj file
if ($ProjectPath) {
    $project = [xml] (Get-Content $ProjectPath -Raw)
    if ($project.Project.Sdk -ine "Microsoft.NET.Sdk.Web") {
        throw "$ProjectPath is not a Microsoft.NET.Sdk.Web project"
    }

    $TargetFramework = "$($project.Project.PropertyGroup.TargetFramework)".Trim()
    $RootNamespace = "$($project.Project.PropertyGroup.RootNamespace)".Trim()
    $WorkingDirectory = (Get-Item $ProjectPath).Directory.FullName
    $AssemblyPath = "$WorkingDirectory\bin\$Build\$TargetFramework\$RootNamespace.dll"
    if (-not (Test-Path $AssemblyPath)) {
        $AssemblyPath = "$WorkingDirectory\bin\$TargetFramework\$RootNamespace.dll"

        if (-not (Test-Path $AssemblyPath)) {
            throw "Could not find $AssemblyPath"
        }
    }
}

# Get the newest version of Visual Studio installed on this machine
Import-Module VSSetup
$VSSetup = (Get-VSSetupInstance | Sort-Object { $_.InstallationVersion } -Descending | Select-Object -First 1)

# Build some path strings
$VSIISExePath = "$($VSSetup.InstallationPath)\Common7\IDE\Extensions\Microsoft\Web Tools\ProjectSystem\VSIISExeLauncher.exe"
$DotNetPath = (Get-Command dotnet).Source
$IISSupportPath = "bin\IISSupport"

# For debugging purposes
Write-Host "Working Directory: $WorkingDirectory"
Write-Host "Assembly Path:     $AssemblyPath"
Write-Host "VSIISEXELauncher:  $VSIISExePath"
Write-Host "DotNet:            $DotNetPath"

# Create the support folder and copy needed files
Push-Location $WorkingDirectory

mkdir -Force $IISSupportPath | Out-Null
Copy-Item $VSIISExePath $IISSupportPath

@"
-p $DotNetPath
-pidFile $WorkingDirectory\$IISSupportPath\pidfile.txt
-wd $WorkingDirectory
-a exec `"$AssemblyPath`"
-env ASPNETCORE_CONTENTROOT=$WorkingDirectory`0COMPLUS_ForceENC=1`0ASPNETCORE_ENVIRONMENT=Development`0
"@ | Set-Content "$IISSupportPath\IISExeLauncherArgs.txt"

# Show the list of files as proof the command completed
Get-ChildItem $IISSupportPath

Pop-Location

IIS网站创建:

与上一段相关的旁注,如果您正在寻找一种设置IIS站点的方法,请查看WebAdministration PowerShell模块。您可以轻松创建站点,设置站点绑定,添加/配置应用程序池以及设置web.config选项。 IIS设置还将显示为PowerShell(IIS:\)中的驱动器,以便使用New-ItemGet-Item等轻松访问设置。

另外,请查看Carbon PowerShell模块,该模块可用于轻松设置主机条目,而无需手动修改主机文件。也可以在Chocolatey上使用。