为 ASP.NET Core 构建 Web 部署包时如何指定自定义 parameters.xml?

How to specify a custom parameters.xml when building a Web Deploy package for ASP.NET Core?

概述

我正在构建一个可以导入到 IIS 中的可部署 Web 包,它会自动提示我的 ASP.NET 核心应用程序所需的设置。我已经创建了一个可以很好部署的包,除了部署之后,我需要手动 find/edit 我的 appsettings.json 文件。

我知道这个包可以包含一个 parameters.xml 文件,当将应用程序导入 IIS 时,该文件会自动提示并填写我的 appsettings.json。我已经制作了一个 parameters.xml 文件,并在构建后手动将其添加到我的包中;它按预期工作。我只想让 msbuild 自动将 parameters.xml 文件添加到包中。

我的一个单独项目 (ASP.NET MVC 4) 已经这样做了。为此,我只需要将 parameters.xml 放在与 .csproj 相同的文件夹中。我尝试在这里做同样的事情,但没有成功。

重现步骤

我创建了一个 ASP.NET 核心 Web 应用程序 在 ASP.NET Core 1.1 上使用 .NET Framework 然后我去发布我的网站

已选择'Folder'(只为获取模板)

然后我编辑了配置文件并将 WebPublishMethod 更改为 Package 并在其下方添加了三行。

<DesktopBuildPackageLocation>bin$(Configuration)$(MSBuildProjectName).zip</DesktopBuildPackageLocation>
<PackageAsSingleFile>true</PackageAsSingleFile>
<DeployIisAppPath>External</DeployIisAppPath>

然后又发了一篇。现在我得到了一个可以部署到 IIS 的 WebDeploy 包。

太棒了!但是...

我想自定义 parameters.xml。

对于以前的项目,我能够将 parameters.xml 文件添加到我的项目根目录,并且 VS/msbuild 会自动将其添加到我发布的包中。这目前适用于使用 ASP.NET MVC 4 的不同项目。

所以,我为这个项目尝试了同样的事情。首先我添加了一个settings.json,设置非常简单:

{
  "SettingName": ""
}

然后我添加了一个我知道可以工作的 parameters.xml 文件到我的项目根目录。 (如果我手动替换Sample.zip包中的parameters.xml文件,部署时会正确提示并替换我的设置)

<parameters>
  <parameter name="IIS Web Application Name" value="External" tags="IisApp">
    <parameterEntry kind="ProviderPath" scope="IisApp" match="^c:\users\joshs\documents\visual\ studio\ 2017\Projects\Sample\Sample\obj\Release\net461\win7-x86\PubTmp\Out\$" />
  </parameter>
  <parameter name="Setting Name" description="Enter a custom app setting" defaultValue="Default Setting Value">
    <parameterEntry kind="TextFile" scope="obj\Debug\net461\win7-x86\PubTmp\Out\appsettings\.json$" match="(?&lt;=\&quot;SettingName\&quot;\s*:\s*\&quot;)[^\&quot;]*" />
  </parameter>
</parameters>

再次,我右击并再次Publish。这次使用 parameters.xml 文件。

我希望 Sample.zip 包含我添加到项目根目录中的 parameters.xml,但它没有。它与我最初发布的完全相同。

问题

在创建 web 部署包的构建过程中,如何在 parameters.xml 中包含自定义设置?

我已经试过了...

我已经看过 ,但运气不好,尽管我的命令与原始发布者略有不同。

PS C:\Users\joshs\Documents\Visual Studio 2017\Projects\Sample> & 'C:\Program Files (x86)\Microsoft Visual Studio17\E
nterprise\MSBuild.0\Bin\MSBuild.exe' .\Sample.sln /t:Sample /p:DeployOnBuild=true /p:PublishProfile=FolderProfile /p:
ProjectParametersXMLFile="C:\Temp\parameters.xml"

我相信我可以通过 cmd 行将参数作为 msbuild 的属性传递。 不完全是你要求的我明白了。
例如,在下面的命令中,我传递 DeployIisAppPath 属性:

dotnet publish /p:WebPublishMethod=Package /p:DeployIisAppPath=mysite/myapp /p:PublishProfile=rnddev03-core-dev 

在输出文件夹中,我们将得到 xxx.SetParameters.xml 文件:

<parameters>
  <setParameter name="IIS Web Application Name" value="mysite/myapp" />
</parameters>

我能够根据 peteawood 在 GitHub.

上发布的问题的评论解决这个问题

https://github.com/aspnet/websdk/issues/201#issuecomment-349990389

在 ASP.NET Core 2.0+ 中,您可以将以下内容添加到您的 .csproj

<Project Sdk="Microsoft.NET.Sdk.Web">
    .
    .
    <Target Name="AddMoreParameters" AfterTargets="_CreateParameterFiles">
        <Copy SourceFiles="Parameters.xml" DestinationFiles="$(_MSDeployParametersFilePath)" />
    </Target>
</Project>

SourceFiles 应该从 .csproj 文件的角度指向您的 parameters.xml 文件的位置。我的 parameters.xml 位于与我的项目文件相同的目录中。