我遇到一个非常奇怪的问题,我在其中创建了一个自定义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"

最佳答案

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

<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>

您可以在这里找到更多信息 :
  • MSBuild ItemGroup Include/Exclude pattern issue
  • http://blogs.msdn.com/b/msbuild/archive/2006/01/03/508629.aspx
  • http://www.sedodream.com/PermaLink,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx
  • 关于asp.net-mvc - 未使用MSBuild,Teamcity复制Bin文件夹,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3943136/

    10-16 16:36