发布时保留对现有文件的更改

时间:2014-10-08 13:42:21

标签: tfs msbuild

我遇到了我的发布文件最初正确的情况,但之后被其原始版本取代。我怀疑事件的顺序是错误的,再加上根目录中的内容。

基本上我已经成功设置了我的发布环境,它执行一个自定义命令来创建一些JavaScript(在我的项目之外创建)。因为源代码管理中的文件需要引用这个新创建的JavaScript,所以我只是将文件(MyControl.ascx)复制到临时位置(因此它丢失了TFS的读取锁定)并且我正在使用自定义命令更新引用JS。完成后,我收集所有文件(自定义JavaScript,以及编辑后的MyControl.ascx临时位置)并发布。

它首先发布所有内容,所以我看到了新的JS以及更新的MyControl.ascx,但几分钟后它完成了发布,而Control看起来就像它在根目录中的样子。

我认为发生的事情是它只是在我的自定义控件(位于另一个目录中)中推出根目录(包括MyControl.ascx)中的内容。 / p>

<PropertyGroup>
     <PipelineCollectFilesPhaseDependsOn>
       CustomCollectFiles;
       $(PipelineCollectFilesPhaseDependsOn);
     </PipelineCollectFilesPhaseDependsOn>
   </PropertyGroup>

   <Target Name="CustomCollectFiles">
     Exec Command="MyCommand.bat"
     <ItemGroup>
         <_BundledJS Include="$(MSBuildThisFileDirectory)..\..\Includes\javascript\*.js" />
         <FilesForPackagingFromProject Include="%(_BundledJS.Identity)">
            <DestinationRelativePath>Includes\javascript\%(Filename)%(Extension)   
            </DestinationRelativePath>
         </FilesForPackagingFromProject>
     </ItemGroup>
  <ItemGroup>
     <_UpdatedControl Include="$(MSBuildThisFileDirectory)..\..\TempArea\MyControl.ascx" />
     <FilesForPackagingFromProject Include="%(_UpdatedControl.Identity)">
          <DestinationRelativePath>Controls\%(Filename)%(Extension)
          </DestinationRelativePath>
     </FilesForPackagingFromProject>
  </ItemGroup>
 </Target>

所以你可以在上面看到我在...... \ TempArea \ MyControl.ascx中采取了一些东西并将其推送到Controls \%(文件名)%(扩展名)。

任何想法我怎么能告诉它基本上保留我的.... \ TempArea \ MyControl.ascx而不用项目中的原始MyControl.ascx覆盖它(.... \ Controls \ MyControl.ascx)?

非常感谢!

1 个答案:

答案 0 :(得分:0)

所以我实际上最终搞清楚了,并希望分享:

<ItemGroup>
     <_UpdatedControl Include="$(MSBuildThisFileDirectory)..\..\TempArea\MyControl.ascx" />
     <FilesForPackagingFromProject Remove="Controls\MyControl.ascx" ></FilesForPackagingFromProject>
     <FilesForPackagingFromProject Include="%(_UpdatedControl.Identity)" >
       <DestinationRelativePath>Controls\%(RecursiveDir)%(Filename)%(Extension)    </DestinationRelativePath>
     </FilesForPackagingFromProject>
   </ItemGroup>

所以你可以在这里看到它实际上删除了原始控件,然后将其添加回来。

我也改变了目标:

<PropertyGroup>
  <OnAfterPipelineCollectFilesPhase>
    CustomCollectFiles;
    $(OnAfterPipelineCollectFilesPhase);
  </OnAfterPipelineCollectFilesPhase>
</PropertyGroup>

如果有任何问题可以帮助我,请告诉我们!