我有一个MSBuild脚本,它为我的网络应用程序生成部署脚本。
<MSBuild Projects="xxxxx.sln" Properties="
CreatePackageOnPublish=true;
DeployOnBuild=true;
IncludeIisSettings=true;
IncludeAppPool=true;" >
<Output TaskParameter="TargetOutputs" ItemName="CompiledAssembly" />
</MSBuild>
执行此操作时,它会在输出中生成一个Package
文件夹,其中包含部署.cmd
文件和关联的.zip
文件。
<?xml version="1.0" encoding="utf-8"?>
<parameters>
<setParameter name="IIS Web Application Name" value="Default Web Site\xxxxx" />
<setParameter name="DefaultConnection-Web.config Connection String"
value=" ... snipped ..." />
</parameters>
如您所见,此处没有对应用池的引用。同样,在生成的xxxx.zip \ parameters.xml
中提到了app pool执行xxxxxx.deploy.cmd /Y
时,它会在IIS中正确创建应用程序。问题是,它似乎使用了机器的默认应用程序池。这是一个.net 4应用程序,因此如果默认为.net 2,则该应用程序无法运行。
是否有办法让部署脚本包含应用程序池定义,以便不需要手动更改应用程序池?
我确实发现this question,似乎是一样的。但是,正如您所看到的,我已经包含了该问题的答案,并且没有任何效果。
答案 0 :(得分:3)
如果您尝试将4.0应用程序部署到2.0默认应用程序池而不提供覆盖,它将无法运行但无法部署,MSDeploy将无法预先创建ERROR_APPPOOL_VERSION_MISMATCH
错误的虚拟应用程序
IncludeAppPool
是正确的属性,但它只告诉打包者包含设置,您必须提供源,即“主”虚拟应用程序以及要从中复制的正确应用程序池。
打开项目属性并从IIS Express
切换到Local IIS
,这将在包/发布选项下启用应用程序池标记。我相信您可以在之后切换回来,设置将保留。
这基本上可以做两件事,添加<IncludeAppPool>true</IncludeAppPool>
以及在<WebProjectProperties>
部分下添加主应用。现在,当您构建或打包源清单时,不会有managedRuntimeVersion
要求,但您的参数现在将自定义IIS Web Application Pool Name
。
如果你想真正创建一个新的应用程序池,那么它会变得棘手。我不知道在创建iisApp
期间或使用某些MSBuild标志创建它的方法,但是使用MSDeploy(.cmd
后面的工具)它将需要转储本地池并同步使用appPoolConfig
提供程序,可能是.build
调用之前.cmd
脚本的一部分。
msdeploy -verb:sync -source:appPoolConfig=Foo -dest:package=foo.zip
msdeploy -verb:sync -source:package=foo.zip -dest:appPoolConfig=Foo,computerName=Bar
请记住,如果没有指定单独的appPoolConfig,同步应该会破坏其他池,所以首先请-whatIf
以防万一。
你可以尝试将你的软件包的archive.xml
和archive.xml
与应用程序池定义合并,但我无法想象它是如何工作的以及iisApp
之间的关系那里有appPoolConfig
个提供者。
修改:您可以使用manifest
provider将package
或iisApp
与appPoolConfig