如何使用MSBuild将MSDeploy转换为文件系统来避免这种深层文件夹结构?

如何使用MSBuild将MSDeploy转换为文件系统来避免这种深层文件夹结构?,msbuild,teamcity,msdeploy,webdeploy,Msbuild,Teamcity,Msdeploy,Webdeploy,我正在为这个MSBuild问题发牢骚 我们正在使用TeamCity构建一个包含两个MVC网站的解决方案。作为构建的一部分,我们将部署到构建服务器上的文件夹中。IIS指向此文件夹,为我们提供管理层可见的集成构建 以下是MSBuild文件中的代码,该文件使用MSDeploy发布包,但不是作为zip文件发布 <Target Name="Deploy"> <MSBuild Projects="$(SolutionFile)" Properties="Platfor

我正在为这个MSBuild问题发牢骚

我们正在使用TeamCity构建一个包含两个MVC网站的解决方案。作为构建的一部分,我们将部署到构建服务器上的文件夹中。IIS指向此文件夹,为我们提供管理层可见的集成构建

以下是MSBuild文件中的代码,该文件使用MSDeploy发布包,但不是作为zip文件发布

<Target Name="Deploy">
  <MSBuild 
    Projects="$(SolutionFile)"
    Properties="Platform=$(Platform);Configuration=$(Configuration);
    DeployOnBuild=true;
    DeployTarget=Package;
    PackageLocation=$(PackageLocation);
    PackageAsSingleFile=False;
    AutoParameterizationWebConfigConnectionStrings=False" />
</Target>

这里的问题是我们得到了一个非常深的文件夹结构。这里有一个例子

C:\DEPLOY\Archive\Content\C\U C\Users\Edmond\Documents\Visual Studio 2008\CreatioGreen\Creatio\Code\core\trunk\Website\Website\obj\Release\Package\PackageTmp[已发布文件]

我真的很想部署到可预测的文件夹,如

C:\build\website[已发布文件] C:\build\mobilewebsite[已发布文件]

这就是背景。以下是具体问题

  • 我们试图使用MSDeploy发布到本地文件系统是否犯了错误?我们基本上需要与VS2010“发布”功能等效的配置转换。我们没有试图部署到远程IIS实例或任何东西

  • 除了指定发布文件夹外,还有其他方法可以执行此操作吗

  • 我一直在尝试使用MSBuild Copy任务将文件复制到更合理的文件夹中-但我不知道如何使用通配符来指定需要使用的文件夹-它需要类似于

  • C:\FolderPackageEndsUpIn[ANYFOLDERS]\Website[ANYFOLDERS]\PackageTmp**


    救命啊

    您可以直接使用WebDeploy获得更优化的结果。例如,您可以使用以下命令将2个文件夹直接同步到根目录:

    %ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe”-动词:sync-source:dirPath=-dest:dirPath=

    或者,您可以使用iisApp提供程序而不是dirPath,使WebDeploy在目标上包含IIS配置:

    %ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe”-动词:sync-source:iisApp=-dest:iisApp=

    例如,要从简单文件夹同步到默认网站下的新应用程序“NewApp”,您可以这样称呼它:

    %ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe”-动词:sync-source:iisApp=“d:\MyWebSite”-dest:iisApp=“Default Web Site/NewApp”


    然后,您可以拥有一个批处理文件,该批处理文件将通过直接调用WebDeploy执行同步/打包,并将作为生成后事件执行。

    如果将_-PackageTempDir参数添加到MSBuild,则会得到与本地发布相同的结果。e、 g

    msbuild C:\PathToMyProj.csproj/p:Configuration=UAT;DeployOnBuild=true;PackageAsSingleFile=False;部署目标=包_PackageTempDir=c:\PathToMyDeploy\;AutoParameterizationWebConfigConnectionStrings=false


    此命令将把我的所有文件发布到c:\PathToMyDeploy\中,而不使用疯狂的子文件夹

    有一个稍微隐藏但优雅的解决方案

    在共享CI服务器上运行生成时,由于隔离原因,可能很难将其打包到c:root中。人们最终更愿意删除包本身中的深层路径

    幸运的是,有一个解决办法。在.pubxml文件中添加替换规则!我在《ms build engine内部》第二版的补充资料中找到了它:


    我也在这个博客中找到了它:

    谢谢你的回答,卡特罗!这很有帮助。我一直这样做,直到我发现我无法让Web.config转换工作。您知道如何在不使用包目标的情况下实现这一点吗?您可以通过创建一个跳过替换规则来解决Web.config转换的问题,该规则将使Web部署跳过同步Web.config并将Web.release.config替换为Web.config。下面是一篇关于跳过替换规则的博客文章,让您开始:我如何在Azure CD管道中实现这一点?