如何使用MSBuild将MSDeploy到文件系统的深层文件夹结构避免?

27

我因为这个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:[ANYFOLDERS] \ obj \ Release \ Package \ PackageTmp [已发布的文件]
我真的想要部署到可预测的文件夹,例如...
C:\build\website [已发布的文件] C:\build\mobilewebsite [已发布的文件]
那就是背景。以下是具体问题。
1. 我们尝试使用MSDeploy发布到本地文件系统是否犯了一个错误?我们基本上需要VS2010“发布”功能的等效功能,带有配置转换。我们并不试图部署到远程IIS实例或其他任何东西。
2. 有没有办法这样做,但指定发布文件夹?
3. 我一直在尝试使用MSBuild复制任务将文件复制到更合理的文件夹中-但我无法弄清楚如何使用通配符指定所需的文件夹-它应该是类似于...
C:\FolderPackageEndsUpIn [ANYFOLDERS] \ Website [ANYFOLDERS] \ PackageTmp * *。 求救!

在Azure CD管道中,我该如何实现这个? - ANIL MANE
3个回答

32
如果您在MSBuild中添加"_PackageTempDir"参数,它将会给出与本地发布相同的结果。例如:

msbuild C:\PathToMyProj.csproj /p:Configuration=UAT;DeployOnBuild=true;PackageAsSingleFile=False;DeployTarget=Package;_PackageTempDir=c:\PathToMyDeploy\;AutoParameterizationWebConfigConnectionStrings=false

该命令将把所有文件发布到c:\PathToMyDeploy\,而不会产生繁琐的子文件夹。


谢谢你的回答 - 那解决了我的问题。我使用 Azure 管道来构建我的解决方案,一直对深层文件夹结构感到烦恼。 - clfaster

4
您可以直接使用 WebDeploy 来获得更精确的输出。例如,您可以使用以下命令直接将两个文件夹同步:

> "%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:dirPath=<SourceFolder> -dest:dirPath=<DestinationFolder>

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

> "%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp=<SourceFolderOrIISPath> -dest:iisApp=<DestinationFolderOrIISPath>

例如,要从一个简单的文件夹同步到 Default Web Site 下的一个新应用程序 "NewApp",您应该这样调用它:

> "%ProgramFiles%\IIS\Microsoft Web Deploy\msdeploy.exe" -verb:sync -source:iisApp="d:\MyWebSite" -dest:iisApp="Default Web Site/NewApp"

然后,您可以创建一个批处理文件,通过直接调用 WebDeploy 执行同步/打包,并将其作为后期构建事件执行。


我一直这样做,直到我发现无法使Web.config转换起作用。有没有什么办法可以不使用Package目标来实现呢? - Rob Stevenson-Leggett
你可以通过创建一个跳过替换规则来解决Web.config转换的问题,这将使Web Deploy跳过同步web.config并用web.release.config替换web.config。以下是有关跳过替换规则的博客文章,可帮助您入门:http://blogs.iis.net/msdeploy/archive/2008/05/23/how-to-write-skip-and-replace-rules-for-msdeploy.aspx - kateroh

4
有一种略微隐藏但优雅的解决方案。 在共享CI服务器上运行构建时,由于隔离原因,可能很难将c:根目录打包到其中。最终,人们会更喜欢删除软件包本身中的深层路径。 幸运的是,有一个解决方案。在.pubxml文件中添加替换规则!我在MS Build引擎第二版内部补充中找到了它:https://www.microsoft.com/learning/en-us/book.aspx?ID=16854 我还在这个博客中找到了它:http://learnaspmvc.blogspot.se/2014/07/web-packaging-fixing-long-path-issue.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接