【问题标题】:Including files outside of the project in MSBuild在 MSBuild 中包含项目之外的文件
【发布时间】:2014-10-04 13:24:56
【问题描述】:

我在 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 上的“构建”,并将新构建排入队列。果然,我能够看到文件输出到构建服务器上的同一目录。现在,我对 MSBuild 不是 100% 确定,但我注意到就像我在本地发布时一样,它也在构建服务器上创建了一个 _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 不使用发布,这就是它在本地工作的原因(因为我选择发布)?

非常感谢您的帮助

更新 按照下面的 cmets 进行了尝试,但这次文件甚至没有出现(所以它现在似乎甚至没有运行任务)。知道为什么吗?我输入对了吗?

<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 的构建排队。简单地排队构建时是否可以挂钩到上述代码块?还是我需要发布?

【问题讨论】:

    标签: tfs msbuild


    【解决方案1】:

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

    /p:DeployOnBuild=true;PublishProfile=Release
    

    显然使用您自己的 PublishProfile 名称

    【讨论】:

    • 所以当我在 TFS 中排队构建时,它是否 NOT 执行发布?有什么方法可以运行上面的代码而无需发布?
    • 没有发布,除非您使用上面显示的 MSBuild Args 告诉它。你可以做类似的事情,但你上面的代码是针对我假设的发布,因为“FilesForPackagingFromProject”在代码中
    • 谢谢,所以我认为正在发生的事情是,当我排队时,我看到文件被推送到发布目标仅仅是因为 ms 构建活动,对吗?也出版有什么害处吗?
    • 没想到
    • 好的,让我试试这个开关,看看会发生什么,谢谢。我很快就会回来告诉你,并且不会忘记标记已回答:)
    【解决方案2】:

    在 VS2012 中,目标被重命名为:

    CopyAllFilesToSingleFolderForPackageDependsOn

    到:

    CopyAllFilesToSingleFolderForMsdeployDependsOn

    更新:看起来上面的目标没有从 VS2012 目标中调用,你可以用对目标“PipelineCollectFilesPhaseDependsOn”的调用来替换它吗?那应该可以解决它。

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

    【讨论】:

    • 是的,这是真的,谢谢,虽然如果你看我确实在它下面有它(所以我两者都有)。可以吗,还是您认为这会产生问题?它不会引发有关编译或保存项目的任何错误。感谢您的帮助:)
    • 没有骰子 - 我在上面更新了 - 你有没有机会让我知道你的想法?感谢您的支持!
    • MSBUILD 是进行部署还是发布?我应该只是将所有内容 xcopy 到目标服务器吗?
    猜你喜欢
    • 2016-12-22
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-11
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多