2010-10-15 3 views
4

У меня очень странная проблема, когда я создал пользовательскую задачу MSBuild, которая переместила бы все файлы, которые мне нужны для моего проекта MVC, в конкретное место, чтобы мы могли его опубликовать. Это отлично работает, когда я запускаю сценарий локально на моей машине, но как только я проверю эти изменения, и Teamcity запускает скрипт, он копирует все, кроме как из папки Bin. Однако, если вы запускаете MSbuild напрямую из командной строки (тот же скрипт), он копирует папку bin. Я не понимаю, почему это не работает, когда TeamCity его строит.Bin папка не копируется с MSBuild, 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) является paramanter я передаю в от Teamcity & вручную в командной строке.

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

Как выглядит остальная часть вашего скрипта сборки - где объявлены $ (ArtifactsDir) и $ (BinFolder)? – stack72

+0

Добавлен немного больше информации выше. – MrW

ответ

5

Я думаю, что это проблема оценки предметов. Ваш элемент «BinFolder» интерпретируется в первый раз, когда MsBuild читает ваш файл сборки, т. Е. Перед сборкой. И я думаю, что $ (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> 

Вы можете найти более подробную информацию здесь:

+0

Действительно интересный ответ. Я думал, что это может быть что-то в этом роде, но никогда не думал о том, что происходит акселерация места расположения корзины. Я попробую сразу. – MrW

+0

Устранение ошибки «@ (BinFolder)» внутри цели (ваш первый пример) решило проблему. Спасибо! – MrW

+0

Да, эта проблема на 100% связана с тем фактом, что объекты за пределами целей оцениваются до того, как выполняется любая цель. FYI эта проблема не имеет ничего общего с ошибкой CallTarget, и для MSBuild 4 вам не нужно использовать CreateItem. Помещение ItemGroup внутри цели практически одинаково. –

Смежные вопросы