Определение выводов ProjectReference в MSBuild, не инициировав избыточный восстанавливает

Как часть решения, содержащего много проектов, у меня есть проект что ссылки (через a <ProjectReference> три других проекта в решении, плюс некоторые другие). В AfterBuild, Я должен скопировать выводы 3 определенных зависимых проектов к другому местоположению.

Через различный ТАК ответы, и т.д. способ, которым я обосновался на выполнить, который был:

    <MSBuild 
        Projects="@(ProjectReference)" 
        Targets="Build" 
        BuildInParallel="true" 
        Condition="'%(Name)'=='ProjectA' OR '%(Name)'=='ProjectB' OR '%(Name)'=='ProjectC'">
        <Output TaskParameter="TargetOutputs" ItemName="DependentAssemblies" />
    </MSBuild>
    <Copy SourceFiles="@(DependentAssemblies)" DestinationFolder="XX" SkipUnchangedFiles="true" />

Однако я столкнулся с проблемами с этим. <MSBuild шаг IncrementalClean задача заканчивает тем, что удалила много выводов ProjectC. При выполнении этого под VS2008, a build.force файл, депонируемый в obj/Debug папка ProjectC, который затем инициировал ProjectC, восстанавливаемый, если я делаю Сборку на всем решении если проект, содержащий это AfterBuild цель, тогда как, если Вы исключаете этот проект из сборки, она [правильно] не инициировала восстанавливание ProjectC (и критически восстанавливание всех зависимых ProjectC). Это может быть определенным для VS обманом в этом случае, который не произошел бы в контексте TeamBuild или другой командной строки вызов MSBuild (но наиболее распространенное использование будет с помощью VS, таким образом, я должен буду разрешить это так или иначе),

Зависимые проекты (и остальная часть решения в целом) были все созданы в интерактивном режиме с VS, и следовательно ProjectRefences содержат относительные пути и т.д. Я видел упоминание об этом являющемся вероятным порождением проблем - но без полного объяснения почему, или когда оно будет зафиксировано или как работать вокруг этого. Другими словами, я действительно не интересуюсь, например, преобразование ProjectReference пути к полным путям редактированием руки .csproj.

В то время как совершенно возможно, что я делаю что-то глупое, и кто-то сразу укажет на то, что это (который был бы большим), быть гарантированным, что я провел много времени, детально изучив /v:diag выводы и т.д. (хотя я не попытался создать репродукцию с нуля - это находится в контексте относительно сложной полной сборки),

7
задан Ruben Bartelink 18 September 2010 в 07:12
поделиться

1 ответ

Мой текущий обходной путь основан на этом вопросе SO , то есть у меня есть:

    <ItemGroup>
        <DependentAssemblies Include="
            ..\ProjectA\bin\$(Configuration)\ProjectA.dll;
            ..\ProjectB\bin\$(Configuration)\ProjectB.dll;
            ..\ProjectC\bin\$(Configuration)\ProjectC.dll">
        </DependentAssemblies>
    </ItemGroup>

Это, однако, не работает в TeamBuild (где все выходные данные попадают в один каталог), а также если имена изменения любого из выходов зависимых проектов.

РЕДАКТИРОВАТЬ: Также ищем комментарии о том, есть ли более ясный ответ о том, как сделать жесткое кодирование немного чище, чем:

    <PropertyGroup>
        <_TeamBuildingToSingleOutDir Condition="'$(TeamBuildOutDir)'!='' AND '$(CustomizableOutDir)'!='true'">true</_TeamBuildingToSingleOutDir>
    </PropertyGroup>

и:

    <ItemGroup>
        <DependentAssemblies 
            Condition="'$(_TeamBuildingToSingleOutDir)'!='true'"
            Include="
                ..\ProjectA\bin\$(Configuration)\ProjectA.dll;
                ..\ProjectB\bin\$(Configuration)\ProjectB.dll;
                ..\ProjectC\bin\$(Configuration)\ProjectC.dll">
        </DependentAssemblies>
        <DependentAssemblies 
            Condition="'$(_TeamBuildingToSingleOutDir)'=='true'"
            Include="
                $(OutDir)\ProjectA.dll;
                $(OutDir)\ProjectB.dll;
                $(OutDir)\ProjectC.dll">
        </DependentAssemblies>
    </ItemGroup>
1
ответ дан 6 December 2019 в 11:48
поделиться
Другие вопросы по тегам:

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