Пользовательская общая цель для построения решения - PullRequest
10 голосов
/ 03 августа 2010

Я создал пользовательскую общую цель «RealClean», которая удаляет все файлы в каталоге вывода и «промежуточном выводе».Я положил его в файл Microsoft.Common.targets.Когда я запускаю MsBuild на моем csproj, все в порядке.Но когда я запускаю MsBuild на моем sln (который просто ссылается на список csproj), у меня появляется следующая ошибка

error MSB4057: The target "RealClean" does not exist in the project.

Вот командная строка, которую я вводю для запуска MsBuild

C:\Windows\Microsoft .NET\Framework\v3.5\MsBuild.exe /p:Configuration="Release";OutputPath="..\..\MSBuild.Referentiel.net35";nowarn="1591,1573" /t:RealClean mySolution.sln

Любой намек?

Ответы [ 3 ]

16 голосов
/ 07 августа 2010

У меня была такая же проблема, но я не хотел изменять вещи вне дерева исходных текстов, чтобы заставить это работать.Добавление файлов в C: \ Program Files ... означает, что вы должны сделать это вручную на каждом компьютере разработчика, чтобы получить такое же поведение.

Я сделал три вещи:

1) СоздалФайл пользовательских целей, который я импортирую в каждый проект C # и / или VB / F # в своем решении, добавив следующее в каждый файл proj:

<!-- Rest of project file -->

<PropertyGroup Condition="'$(SolutionDir)' == '' or '$(SolutionDir)' == '*undefined*'">
    <!-- Relative path to containing solution folder -->
    <SolutionDir>..\</SolutionDir>
</PropertyGroup>
<Import Project="$(SolutionDir)CommonSettings.targets" />

2) Добавлена ​​чистая цель, которая вызывается после реальной очистки(используя атрибут AfterTargets из MSBuild 4.0):

<Target Name="CleanCs" AfterTargets="Clean">
    <Message Text="Deep cleaning C# project..." />
    <CreateItem Include="$(OutDir)**\*.*; $(ProjectDir)\obj\**\*.*; $(IntermediateOutputPath)**\*.*"
                            Exclude="**\bin\**\*.vshost.exe; $(IntermediateOutputPath)**\*.log">
        <Output TaskParameter="Include" ItemName="AfterClean_FilesToDelete"/>
    </CreateItem>
    <Delete Files="@(AfterClean_FilesToDelete)" />
    <CreateItem Include="$(ProjectDir)\obj\" >
        <Output TaskParameter="Include" ItemName="AfterClean_DirectoriesToDelete" />
    </CreateItem>
    <CreateItem Include ="$(ProjectDir)\bin\" Condition="'$(TargetExt)' != '.exe'" >
        <Output TaskParameter="Include" ItemName="AfterClean_DirectoriesToDelete"/>
    </CreateItem>
    <RemoveDir ContinueOnError="true" Directories="@(AfterClean_DirectoriesToDelete)" />
</Target>

3) В моем проекте MSBuild с непрерывной интеграцией я проверяю и проверяю, чтобы все файлы proj имели # 1:

<ItemGroup>
    <!-- Exclude viewer acceptance tests as they must compile as x86 -->
    <CheckProjects_CsProjects Include="**\*.csproj" />
</ItemGroup>
<Target Name="CheckProjects">
    <!-- 
        Look for C# projects that don't import CommonSettingsCs.targets 
    -->
    <XmlRead XPath="//n:Project[count(n:Import[@Project[contains(string(), 'CommonSettingsCs.targets')]]) = 0]/n:PropertyGroup/n:AssemblyName/text() "
        XmlFileName="%(CheckProjects_CsProjects.Identity)"
        Namespace="http://schemas.microsoft.com/developer/msbuild/2003"
        Prefix="n" >
        <Output TaskParameter="Value" ItemName="CheckProjects_CsMissingImports"/>
    </XmlRead>
    <Error Text="Project missing CommonSettingsCs.targets: %(CheckProjects_CsMissingImports.Identity)"
                 Condition="'%(CheckProjects_CsMissingImports.Identity)' != ''" />
</Target>

Thisне позволяет разработчикам забыть добавить # 1.Вы можете создать свой собственный шаблон проекта, чтобы гарантировать, что все новые проекты имеют его по умолчанию.

Преимущество этого подхода в том, что настройка нового набора дерева исходных текстов не требует ничего, кроме получения текущего дерева исходных текстов.Недостатком является то, что вам нужно редактировать файлы проекта один раз при их создании.

5 голосов
/ 04 августа 2010

Madgnome, вероятно, прав. Но я хотел добавить, что вы не должны редактировать файлы Microsoft.common.targets. Если вы это сделаете, вы рискуете иметь другой процесс сборки на этом компьютере, чем у всех остальных. В вашем случае вы могли бы создать новый файл MSBuild только с целью RealClean и поместить его в C: \ Program Files (x86) \ MSBuild \ v4.0 \ Custom.After.Microsoft.Common.targets или для 32 бит C: \ Program Files \ MSBuild \ v4.0 \ Custom.After.Microsoft.Common.targets и, по сути, это было бы то же самое, что поместить этот файл в Microsoft.Common.targets, за исключением того, что вам не нужно изменять этот файл.

5 голосов
/ 03 августа 2010

Для работы с файлом решения MSBuild создает временный файл проекта MSBuild, содержащий только некоторые цели, такие как Build и Clean .Таким образом, вы не можете вызвать свою пользовательскую цель в файле решения.

...