Скопируйте файлы с помощью MsBuild - PullRequest
0 голосов
/ 14 декабря 2010

У меня есть решение с двумя проектами.Одним из них является простой проект, который не зависит от каких-либо специальных сборок для сборки.Однако приложению разрешено запускать внешний исполняемый файл (которым я также владею - это второй проект моего решения).Когда я собираю проект, я бы хотел, чтобы исполняемый файл (+ зависимости, такие как app.config) внешнего проекта копировался в целевой каталог моего проекта.

Как мне добиться этого с помощью MsBuild?Моей первой идеей было добавить ссылку на исполняемый файл (хотя он мне и не нужен для сборки) для копирования файла.Мне это кажется немного хакерским.

Спасибо!

PS Еще один вопрос: допустим, я могу сказать MsBuild скопировать исполняемый файл.Что если исполняемый файл не собран?Могу ли я заставить его построить?

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

В вашем случае вы должны сделать так, чтобы ваш скрипт MSBuild заменил ваше решение и объявить там желаемую зависимость:

<Project DefaultTargets="Executable_A">
    <Target Name="Executable_A" DependsOnTargets="Executable_B">
        <MSBuild Projects="Executable_A.proj" Targets="Build" />
    </Target>

    <Target Name="Executable_B">
        <MSBuild Projects="Executable_B.proj" Targets="Build">
            <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" />
        </MSBuild>
        <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="C:\My_Target_Path\" SkipUnchangedFiles="true" />
    </Target>
</Project>

... и вы можете указать цели вашего второго проекта скопировать его выходные данные вжелаемое месторасположение.Вы даже можете указать своему первому проекту сохранить путь вывода в переменную, чтобы использовать ее при копировании вывода второго проекта (DestinationFolder).

1 голос
/ 14 декабря 2010

Вы смотрели задачу копирования MSBuild: Задача копирования ?

0 голосов
/ 16 февраля 2011

Если вы будете удовлетворены ответом @Filburt, я могу предложить улучшить это решение.

Если вы посмотрите, как работает Build target по умолчанию:

 <Target
    Name="Build"
    Condition=" '$(_InvalidConfigurationWarning)' != 'true' "
    DependsOnTargets="$(BuildDependsOn)"
    Returns="$(TargetPath)" />

Вы увидите, что единственный выход от цели сборки или перестроения - $ (TargetPath) . $ (TargetPath) - это полный путь к сборке. Чтобы изменить это поведение, вы можете взломать процесс сборки. Но проще будет определить собственную цель в проекте B :

<Target
    Name="BuildWithConfig"
    DependsOnTargets="Clean;Build"
    Returns="$(TargetPath);$(TargetPath).config" />

В A проекте просто определите AfterBuild target:

<Target Name="AfterBuild">
    <MSBuild Projects="Executable_B.proj" Targets="BuildWithConfig">
        <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuilt" />
    </MSBuild>
    <Copy SourceFiles="@(AssembliesBuilt)" DestinationFolder="$(OutDir)\SubDirForB" SkipUnchangedFiles="true" />   
</Target>

Это решение не требует создания собственного сценария сборки. Вы получите результат непосредственно в VS.

...