【问题标题】:Bin folder not being copied with MSBuild, Teamcity没有使用 MSBuild、Teamcity 复制 Bin 文件夹
【发布时间】:2010-10-15 14:21:36
【问题描述】:

我有一个非常奇怪的问题,我创建了一个自定义 MSBuild 任务,它将我的 MVC 项目所需的所有文件移动到特定位置,以便我们可以发布它。当我在我的机器上本地触发脚本时,这工作正常,但是一旦我检查了这个更改并且 Teamcity 运行脚本,它会复制除 Bin 文件夹之外的所有内容。 但是,如果直接从命令行(相同的脚本)运行 MSbuild,它会复制 bin 文件夹。我不明白为什么在 TeamCity 构建它时这不起作用。

有谁知道为什么会发生这种情况以及如何解决它?

<Target Name="AfterBuild">
   <CallTarget Targets="Move" />
</Target>
<Target Name="Move">
    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" />
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" />
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" />
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" />
</Target>


<ItemGroup>
   <BinFolder Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*"/>
   <ContentFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Content\*.css"/>
   <ImagesFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Images\*.*"/>
   <ScriptsFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Scripts\*.js"/>
</ItemGroup>

$(ArtifactsDir) 是我在命令行中手动从 Teamcity 传入的参数。

/p:ArtifactsDir="%system.agent.work.dir%\WebProject\trunk\Website"

【问题讨论】:

  • 构建脚本的其余部分是什么样子的 - $(ArtifactsDir) 和 $(BinFolder) 声明在哪里?
  • 在上面添加了更多信息。

标签: asp.net-mvc msbuild teamcity


【解决方案1】:

我认为这是项目评估的问题。您的“BinFolder”项在 MsBuild 第一次读取您的构建文件时被解释,即在构建之前。而且我认为 $(ProjectDir)bin***.* 在构建之前是空的。为避免这种情况,您可以在目标中声明您的 bin 文件夹,如下所示:

<Target Name="AfterBuild">
   <CallTarget Targets="Move" />
</Target>
<Target Name="Move">

    <ItemGroup>
      <BinFolder Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*"/>
    </ItemGroup>

    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" />
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" />
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" />
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" />
</Target>

<ItemGroup>
   <ContentFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Content\*.css"/>
   <ImagesFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Images\*.*"/>
   <ScriptsFolder Exclude="*.cs;*.svn-base" Include="$(ProjectDir)Scripts\*.js"/>
</ItemGroup>

或者你可以尝试使用 CreateItem 任务:

<Target Name="Move">

    <CreateItem Exclude="*.cs" Include="$(ProjectDir)bin\**\*.*">
      <Output TaskParameter="Include" ItemName="TheFiles"/>
    </CreateItem>

    <Copy SourceFiles="@(BinFolder)" DestinationFolder="$(ArtifactsDir)\Webproject.Web\bin" />
    <Copy SourceFiles="@(ContentFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Content" />
    <Copy SourceFiles="@(ImagesFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Images" />
    <Copy SourceFiles="@(ScriptsFolder)" DestinationFolder="$(ArtifactsDir)\SchrodersFundEngine.Web\Scripts" />
</Target>

您可以在这里找到更多信息:

【讨论】:

  • 非常有趣的答案。我认为这可能是沿着这条线的东西,但从未想过 bin 文件夹位置的实际删除。我马上试试。
  • 目标内部的“@(BinFolder)”的声明(您的第一个示例)解决了这个问题。非常感谢!
  • 是的,这个问题 100% 与在执行任何目标之前评估目标之外的项目这一事实有关。仅供参考,此问题与 CallTarget 错误无关,对于 MSBuild 4,您不需要使用 CreateItem。将 ItemGroup 放入 target 几乎是一样的。
  • 有趣。因此,我的脚本在 TeamCity 中失败,但通过命令行完美运行。现在解决了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-08-18
  • 2012-10-11
  • 2010-09-12
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
相关资源
最近更新 更多