使用MsBuild生成自定义MsDeploy清单(包目标)
我正在使用Web Deploy为我的产品打包和部署网站。特别是,我的解决方案中有两个不同的项目,我使用此方法进行部署 我在解决方案中有第三个项目(windows服务),它也需要安装在web服务器上 我知道我可以编写自定义清单(用于使用MsBuild生成自定义MsDeploy清单(包目标),msbuild,manifest,msdeploy,slowcheetah,Msbuild,Manifest,Msdeploy,Slowcheetah,我正在使用Web Deploy为我的产品打包和部署网站。特别是,我的解决方案中有两个不同的项目,我使用此方法进行部署 我在解决方案中有第三个项目(windows服务),它也需要安装在web服务器上 我知道我可以编写自定义清单(用于dirPath、filePath和runCommand提供程序)并直接调用MsDeploy进行部署。但是如果可能的话,我想利用现有的MsBuild任务来打包我的服务 我发现可以通过msbuild目标对清单文件进行一些自定义: 特别是通过使用MsDeploySource
dirPath
、filePath
和runCommand
提供程序)并直接调用MsDeploy进行部署。但是如果可能的话,我想利用现有的MsBuild任务来打包我的服务
我发现可以通过msbuild目标对清单文件进行一些自定义:
特别是通过使用MsDeploySourceManifest项
在浏览相应的.targets文件后,如果我使用包
目标,则contentPath
或iisApp
将被追加到我的清单中。理想情况下,我只想复制程序集(或目录),可能设置ACL,并在服务上执行installutil.exe
通过编辑我的csproj文件,是否可以完全自定义由包
目标生成的清单
如果没有,有没有一种简单的方法来建立一个新的目标,它将相当于
包,但允许我吐出一个完全定制的清单?我还没有一个完整的总结,让人们尝试了解这是如何工作的,但我现在有一个总结,至少是如何实现这个目标的
(编辑:链接暂时失效。如果您感兴趣,请告诉我,我可以将其发布到其他地方)
我的指南介绍了以下总体步骤:
- 确保服务在安装后自动启动(不重要,但更容易处理)
- 将Microsoft.WebApplication.targets文件添加到项目中,即使您没有web项目。这将启用
包
MsBuild目标
- 将自定义.targets文件添加到生成自定义MsBuild包清单的项目中
- 向项目中添加一些批处理脚本以停止/卸载并安装服务
- 添加Parameters.xml文件以支持更轻松地更改目标部署目录
- 使用设置app.config转换
然后可以使用以下命令行打包项目:
msbuild MyProject.csproj /t:Package /p:Configuration=Debug
MyService.Deploy.cmd /Y /M:mywebserver -allowUntrusted
您可以使用以下命令行部署生成的包:
msbuild MyProject.csproj /t:Package /p:Configuration=Debug
MyService.Deploy.cmd /Y /M:mywebserver -allowUntrusted
其中最未记录的部分(除了我的指南)是创建自定义清单。这里是我当前文件的转储文件(注意,它仍然有点问题,但可以修复-请参阅此问题:-并尝试继续对runCommand
仅使用直接批处理文件)
真的
真的
真的
真的
app.config
真的
真的
假的
假的
假的
真的
$(在将设置和文件内容添加到源清单之前);
AddStopServiceCommand;
$(在将设置和文件内容添加到源清单之后);
AddSetCustomAclsProvider;
AddInstallServiceCommand;
$(在复制所有文件到单个文件夹或包之后);
MoveAppConfigToCorrectPackagePath;
$(\u MSDeployDirPath\u FullPath)\bin\servicestop.bat
20000
等待时间
$(\u MSDeployDirPath\u FullPath)
本地服务
完全控制
目录
setAclUser;setAclAccess;setAclResourceType
cmd.exe/c$(\u MSDeployDirPath\u FullPath)\bin\serviceinstall.bat
20000
假的
等待间隔;顿图塞科曼德克斯酒店
$(\u PackageTempDir)\App.Config
$(\u PackageTempDir)\bin\$(TargetFileName).config
你找到答案了吗?@Graci:找到了。我在这周内完成了这项工作,我会在工作完成后发布一个答案。关键概念是创建自定义.targets
文件,使用自定义目标添加runCommand
提供程序条目以执行自定义批处理文件(用于停止/卸载服务,以及安装/启动服务),向项目添加自定义Parameters.xml文件,并设置某些标志,例如includeIsSettingsonPublish=False
和includeIsSettingsonPublish=False
。哦,免费的SlowCheetah非web转换扩展也很有帮助。@Merlyn:如果您能抽出时间分享您的解决方案,那就太好了,从您上次的评论来看,听起来好像您已经很好地涵盖了它。@JakubJanuszkiewicz:检查我的新答案和其中的链接。如果你有问题,请告诉我-我完全准备好改进这个,尽管我不想让它像钻石一样闪闪发光,除非人们感兴趣:)@musica:我得到了答案。很抱歉,我花了这么长时间才写了一篇评论:)如果你还感兴趣,请查看。为什么在步骤列表中包含它们的原始值,而之前你声称它们是空的?真的是因为可怕的事情才需要吗?我的意思是,一些属性看起来像$(prop);扩展
,因此它们都是“未设置时使用”和“注入,而不是重写”。只有在没有附加任何其他内容的情况下,您的示例才会自行附加,同时它会尝试保留原始内容(假定其前面是空的)。我认为不需要这种条件,也不需要“concat”行为。不管怎样,这是一项伟大的工作!在找到您的代码片段之前,我刚刚找到了一个类似的补丁/扩展,所以这可能是唯一的方法。顺便说一句,我还发现transformwebconfig
在默认情况下具有true
,因此可能也可以对其进行修剪。Btw2。您是否尝试过app.config的参数化?由于