我有一个非常奇怪的问题,我创建了一个自定义 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"
我认为这是一个项目评估的问题。您的“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>
您可以在这里找到更多信息 :
- MSBuild ItemGroup 包含/排除模式问题
- http://blogs.msdn.com/b/msbuild/archive/2006/01/03/508629.aspx
- http://www.sedodream.com/PermaLink,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)