在MSBuild中包含项目外部的文件

时间:2014-10-04 13:24:57

标签: tfs msbuild

我在StackOverflow上找到了其他帖子来处理我遇到的问题,例如:

MSBuild: Deploying files that are not included in the project以及Include Files in MSBuild that are not a part of the project 我想在阅读这些帖子后分享我能够创建的代码,并请求一些帮助,说明为什么它可能无法正常工作?

详细说明究竟什么不是错,我打算做什么。我正在使用Visual Studio 2012和TFS 2012。

我有一个名为CreateMyFiles.bat的批处理文件,我想要执行此操作然后将它输出的文件(它将它们输出到我的Includes / Javascript / Bundled文件夹)并将它们包含在部分在MSBuild中构建(以便将它们部署到目标IIS服务器)。

当我在本地Visual Studio中编辑本地.csproj并将下面的代码添加到文件底部并重新加载时,我能够右键单击我的web项目,选择“发布”,然后选择我的本地基于文件的发布配置文件确实将我的文件部署到了正确的位置。它奏效了!

然后我将代码检入TFS,然后转到TFS上的“构建”,并排队新的构建。果然,我能够看到文件输出到构建服务器上的同一目录。现在,我不是100%肯定MSBuild,但我注意到就像我在本地发布时一样,它也在构建服务器上创建了一个_publishedWebsite文件夹(源代码上面的目录)。问题是,在这个已发布的网站文件夹中,我手动创建的文件不存在。此外,在构建完成后转到目标Web服务器但遗憾的是没有我想要的文件。

所以看起来如果我手动选择发布,下面的代码可以工作,但是如果我用TFS对构建进行排队,它就不起作用了。 MSBuild是否使用发布?这可能是它在下面不起作用的原因吗?

以下是我在.csproj文件中放置的代码:

<Target Name="CustomCollectFiles">
    <Exec Command="CreateMyFiles.bat" /> <!-- Generate Files -->
    <ItemGroup>
       <!-- Create an identity called _CustomFiles, and associate it to the files I created -->
      <_CustomFiles Include="Includes\JavaScript\Bundled\*" />
      <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
        <DestinationRelativePath>Includes\JavaScript\Bundled\*%(Filename)%(Extension)        </DestinationRelativePath>
      </FilesForPackagingFromProject>
    </ItemGroup>
  </Target>

 <!-- Hook into the pipeline responsible for gathering files and tell it to add my files -->
  <PropertyGroup>
    <CopyAllFilesToSingleFolderForPackageDependsOn>
      CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForPackageDependsOn>

    <CopyAllFilesToSingleFolderForMsdeployDependsOn>
       CustomCollectFiles;
      $(CopyAllFilesToSingleFolderForPackageDependsOn);
    </CopyAllFilesToSingleFolderForMsdeployDependsOn>
  </PropertyGroup>

我真的坚持这一点,并想要求一些帮助,说明文件可能不会发生的原因。我怀疑MSBuild不使用发布,这就是它在本地工作的原因(因为我选择发布)?

非常感谢你的帮助

更新 根据下面的评论尝试了这一点,但这次文件甚至没有出现(因此现在似乎甚至没有运行任务)。知道为什么吗?我输入了这个吗?

<Target Name="CustomCollectFiles">
  <Exec Command="CreateMyFiles.bat" />

   <!-- Generate Files -->
   <ItemGroup>
   <!-- Create an identity called _CustomFiles, and associate it to the files I created -->
      <_CustomFiles Include="Includes\JavaScript\Bundled\*" />
     <FilesForPackagingFromProject Include="%(_CustomFiles.Identity)">
       <DestinationRelativePath>Includes\JavaScript\Bundled\*%(Filename)%(Extension)         </DestinationRelativePath>
     </FilesForPackagingFromProject>
   </ItemGroup>
 </Target>

<!-- Hook into the pipeline responsible for gathering files and tell it to add my files -->
<PropertyGroup>
  <PipelineCollectFilesPhaseDependsOn>
    CustomCollectFiles;
    $(PipelineCollectFilesPhaseDependsOn);
  </PipelineCollectFilesPhaseDependsOn>
</PropertyGroup>

更新2 当我使用上面的代码,并将它放入我的pubxml文件然后执行实际的发布时,它可以正常工作,但据我所知,我们的流程只是从TFS排队构建。简单地对构建进行排队是否可以挂钩到上面的代码块?或者我需要发布吗?

2 个答案:

答案 0 :(得分:2)

在VS2012中,目标已从以下位置重命名:

CopyAllFilesToSingleFolderForPackageDependsOn

为:

CopyAllFilesToSingleFolderForMsdeployDependsOn

更新:看起来上面的目标没有从VS2012目标中调用,你可以用对目标的调用来替换它吗?管道收集文件相位取消&#34;?那应该解决它。

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

答案 1 :(得分:2)

要从TFS构建发布,您需要添加以下参数

/p:DeployOnBuild=true;PublishProfile=Release

显然使用您自己的PublishProfile名称