使用MsBuild生成自定义MsDeploy清单(包目标)

使用MsBuild生成自定义MsDeploy清单(包目标),msbuild,manifest,msdeploy,slowcheetah,Msbuild,Manifest,Msdeploy,Slowcheetah,我正在使用Web Deploy为我的产品打包和部署网站。特别是,我的解决方案中有两个不同的项目,我使用此方法进行部署 我在解决方案中有第三个项目(windows服务),它也需要安装在web服务器上 我知道我可以编写自定义清单(用于dirPath、filePath和runCommand提供程序)并直接调用MsDeploy进行部署。但是如果可能的话,我想利用现有的MsBuild任务来打包我的服务 我发现可以通过msbuild目标对清单文件进行一些自定义: 特别是通过使用MsDeploySource

我正在使用Web Deploy为我的产品打包和部署网站。特别是,我的解决方案中有两个不同的项目,我使用此方法进行部署

我在解决方案中有第三个项目(windows服务),它也需要安装在web服务器上

我知道我可以编写自定义清单(用于
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的参数化?由于