Как вызвать ту же цель msbuild дважды с различными параметрами из самого msbuild файла проекта

Если я понимаю правильно, по существу, Вы хотите знать, сколько фиксаций произошло на данном файле начиная с Вас последнее обновление.

Первый получают изменения в удаленном источнике, но не объединяют их в Ваш master ответвление:

% git fetch

Затем получают журнал изменений, которые произошли на данном файле между Вашим master ответвление и удаленным origin/master.

% git log master..origin/master foo.el

Это дает Вам сообщения журнала всех фиксаций, которые произошли в удаленном репозитории, так как Вы в последний раз объединились origin/master в Ваш master.

, Если Вы просто хотите количество изменений, передайте его по каналу к wc. Скажите, как это:

% git rev-list master..origin/master foo.el | wc -l
16
задан alexandrul 19 May 2010 в 10:28
поделиться

3 ответа

У вас должна быть возможность сгенерировать ItemGroup, содержащую Dirs, а затем%.

<ItemGroup>
    <Dirs Include="C:\DirA\;C:\DirB\">
</ItemGroup>
<Target Name="CopyFiles"
    Condition="Exists('%(Dirs)') AND '@(FilesToCopy)' != ''"
    Inputs="@(FilesToCopy)"
    Outputs="@(FilesToCopy -> '%(Dirs)%(Filename)%(Extension)')">
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="%(Dirs)" />
</Target>

Или вы можете сделать 2 явных вызова:

<Target Name="CopyFiles">
    <MsBuild Projects="$(MSBuildProjectFullPath)" Targets="CopyASetOfFiles" Properties="FilesToCopy=@(FilesToCopy);DestDir=$(DirA)" />
    <MsBuild Projects="$(MSBuildProjectFullPath)" Targets="CopyASetOfFiles" Properties="FilesToCopy=@(FilesToCopy);DestDir=$(DirB)" />
</Target>

<Target Name="CopyASetOfFiles"
    Condition="Exists('$(DestDir)') AND '@(FilesToCopy)' != ''"
    Inputs="@(FilesToCopy)"
    Outputs="@(FilesToCopy -> '$(DestDir)%(Filename)%(Extension)')">
    <Copy SourceFiles="@(FilesToCopy)" DestinationFolder="$(DestDir)" />
</Target>

Я не тестировал ни один синтаксис, но Я относительно более уверен во втором.

(Ответ, если он есть, находится в моей книге «Сайед Хашими» на моем столе - вам придется подождать до первого из:

  1. Получить книгу
  2. Мне становится скучно
  3. Сайед находит этот пост и дает блестящий проверенный ответ)
14
ответ дан 30 November 2019 в 21:20
поделиться

Да, то, что вы хотите, называется пакетной обработкой в ​​MSBuild.

;%(Dirs.Identity)

, определенный в выходных данных, вызовет выполнение этой задачи для каждого элемента в Dirs ItemGroup.

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="CopyFiles"
   xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
   ToolsVersion="3.5">

<ItemGroup>
    <Dirs Include="C:\DirA" />
    <Dirs Include="C:\DirB" />
</ItemGroup>

<Target Name="CopyFiles"
    Inputs="@(FilesToCopy);@(Dirs)"
    Outputs="@(FilesToCopy -> '%(Dirs.Identity)%(Filename)%(Extension)');%(Dirs.Identity)" >
    <Message Text="%(Dirs.Identity)" />
</Target>

</Project>

Выходы:

Build started 8/19/2009 10:11:57 PM.
Project "D:\temp\test.proj" on node 0 (default targets).
  C:\DirA
CopyFiles:
  C:\DirB
Done Building Project "D:\temp\test.proj" (default targets).

Измените задачу «Сообщение» на задачу «Копировать» со следующим условием, и все готово:

Condition="Exists('%(Dirs.Identity)') AND '@(FilesToCopy)' != ''"
4
ответ дан 30 November 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: