【问题标题】:MSBuild Issue while deploying files部署文件时的 MSBuild 问题
【发布时间】:2013-03-04 18:17:10
【问题描述】:

我正在服务器上部署一些文件。但是当我这样做时,构建正在删除驻留在该位置的所有文件和文件夹。我不想从服务器中删除所有文件。我想从目标文件夹中排除一个文件夹(文件夹名为 Temp)。临时文件夹不应在删除其他文件时被删除。怎么做?

这是 TFS 构建定义

<PropertyGroup Condition=" '$(DeployEnvironment)' == 'Dev' "> 
<DeployPath>\\server1\D$\temp\reports</DeployPath> 
</PropertyGroup> 
<Target Name="CoreCompileSolution" /> 
<Target Name="AfterCompile"> 
   <Message Importance ="high" Text="Solution Root: $(SolutionRoot)" />
   <Message Importance ="high" Text="Out Dir: $(OutDir)" />
   <Copy SourceFiles="@(RPTFiles)" DestinationFolder="$(OutDir)_PublishedWebsites\Reports\" /> 
 </Target>
<Target Name="AfterDropBuild" > 
  <CreateItem Exclude="$(DeployPath)\Temp*.*"> 
      <Output ItemName="PreviousDeployment" TaskParameter="Include" /> 
  </CreateItem>
</Target>

【问题讨论】:

  • 你是如何部署这些文件的?您是在使用 TFS 构建定义、从 Visual Studio 发布还是其他方式?
  • 您好,我正在使用 TFS 构建定义。这是相同的代码。

标签: msbuild


【解决方案1】:

您为什么使用复制任务?我认为它旨在用于构建期间的本地操作,而不是部署(因为它不会让您有机会轻松配置行为)。

我建议您使用以下选项之一而不是复制 tsak

  • 非网络应用程序 - 使用 Robocopy: /XD dirs [dirs]... :排除与给定名称/路径匹配的目录。 XF 和 XD 可以组合使用,例如

    ROBOCOPY c:\source d:\dest /XF *.doc *.xls /XD c:\unwanted /S 
    

    有关使用指南,请参阅 this link。您可以从命令行运行它(使用&lt;Exec Command="" &gt; 任务,或者使用具有很好包装器的MBuiild Community Tasksproject

  • Web 应用程序:您应该使用Web Deploy 进行部署。您可以使用 MSBuild 集成(VS 2010 及更高版本,请参阅this blog series 以获取有关在 VS2010 上进行设置和配置的指南 NB:在 VS 2012 中已大大简化,但我目前没有可共享的链接)或从命令行运行它(在 VS 2010 之前):

    &lt;Exec Command="&amp;quot;$(WebDeployToolPath)&amp;quot; -verb:sync - source:dirPath='$(MSBuildProjectDirectory)\Published\' -dest:dirPath='$(DeployDirectoryLocalPath)',computerName=$(DeployTargetURL),userName='$(DeployUserName)',password='$(Password)',authType='Basic' -skip:skipaction='Delete',objectname='filePath',absolutepath='app_offline.htm' -skip:skipaction='Delete',objectname='filePath',absolutepath='logs\\.*' -skip:skipaction='Delete',objectname='dirPath',absolutepath='logs\\.*' -skip:skipaction='Delete',objectname='filePath',absolutepath='UserFiles\\.*' -skip:skipaction='Delete',objectname='dirPath',absolutepath='UserFiles\\.*' -verbose -allowUntrusted" /&gt;

注意使用skip:skipaction='Delete.. 跳过删除文件和文件夹。

更新 看起来我理解这有点不正确(我想,部署发生在 AfterCompile 目标中,但是,正如我现在所看到的,TFS 使用 CoreDropBuild 目标进行部署。 所以我认为,您需要的是覆盖CoreDropBuild 目标,如所述:here。 (虽然,我从来没有试过这个)。

您可以使用Copy task 作为线程的作者,或者根据您的个人喜好使用 Robocopy/webdeploy。

【讨论】:

  • 我的 TFS 构建中没有“ROBOCOPY”选项。
  • 好吧,你可以编辑上面粘贴的msbuild文件,不是吗?请参阅此链接thread on msdn forums 以获取 overrdidng CoreDropBuild 任务。
  • 添加了一个更新,其中包含指向 MSDN 论坛的链接,其中描述了如何通过覆盖 CoreDropBuild 目标来排除文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2018-05-20
  • 2015-05-03
相关资源
最近更新 更多