Используя MSBuild, как задать для переменной имя папки, которое будет находиться выше в иерархии файловой системы? - PullRequest
1 голос
/ 29 августа 2011

Я использую MSBuild для нашего процесса CI и пытаюсь найти способ поднять имя папки выше в иерархии файловой системы.Эта папка будет содержать все инструменты для CI.

Папка, которую я ищу, может быть расположена в разных местах на каждом ПК.

Допустим, что скрипт MSBuild выполняется вD: \ Workdir \ BlaBla \ Project1 и интересующая меня папка: D: \ Workdir \ CI

Я бы хотел, чтобы скрипт прошел через файловую систему следующим образом:

  1. Просмотрите текущий каталог (D: \ WorkDir \ BlaBla \ Project1), проверьте папку CI (не найдена)
  2. Перейдите в иерархию (D: \ Workdir \ BlaBla) и проверьте папку CI (не найдена))
  3. Поднимитесь снова (D: \ Workdir) и проверьте папку CI (найдено!)

Возможно ли это в MSBuild?


ПРИМЕЧАНИЯ

Просто чтобы уточнить, я хочу получить результат (расположение папки) в свойстве.


Вот что у меня есть, и я пытаюсь улучшить его;)

<PropertyGroup>
    <CI_PathName Condition=" Exists ('..\CI') ">..\CI</CI_PathName >
    <CI_PathName Condition=" Exists ('..\..\CI') ">..\..\CI</CI_PathName >
    <CI_PathName Condition=" Exists ('..\..\..\CI') ">..\..\..\CI</CI_PathName >
</PropertyGroup>

Это работает, но не оптимально ...

Ответы [ 2 ]

2 голосов
/ 30 августа 2011

Это можно сделать с помощью встроенного задания:

<?xml version="1.0" encoding="utf-8" ?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<UsingTask
    TaskName="FindParentDirectory"
    TaskFactory="CodeTaskFactory"
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">

    <ParameterGroup>
        <BaseDirectory ParameterType="Microsoft.Build.Framework.ITaskItem" Required="true" />
        <TargetDirectoryName ParameterType="System.String" Required="true" />
        <TargetDirectory ParameterType="System.String" Output="true" />
    </ParameterGroup>
    <Task>
        <Using Namespace="System.IO" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
                string baseDirectoryPath = BaseDirectory.GetMetadata("FullPath");
                DirectoryInfo baseDirectory = new DirectoryInfo(baseDirectoryPath);
                DirectoryInfo[] childDirectories = baseDirectory.GetDirectories(TargetDirectoryName);
                if (childDirectories.Length == 1)
                {
                    TargetDirectory = childDirectories[0].FullName;

                    return true;
                }

                while (baseDirectory != baseDirectory.Root)
                {
                    baseDirectory = baseDirectory.Parent;
                    if (baseDirectory.Name == TargetDirectoryName)
                    {
                        TargetDirectory = baseDirectory.FullName;

                        return true;
                    }

                    childDirectories = baseDirectory.GetDirectories(TargetDirectoryName);
                    if (childDirectories.Length == 1)
                    {
                        TargetDirectory = childDirectories[0].FullName;

                        return true;
                    }
                }

                Log.LogError("Unable to find recursively find a directory called '{0}' in a parent of '{1}'.", TargetDirectoryName, baseDirectoryPath);

                return false;

            ]]>
        </Code>
    </Task>
</UsingTask>

<Target Name="Build">
    <FindParentDirectory
        BaseDirectory="$(MSBuildProjectDirectory)"
        TargetDirectoryName="Development">

        <Output
            TaskParameter="TargetDirectory"
            PropertyName="TargetDir" />
    </FindParentDirectory>

    <Message
        Text="TargetDir = '$(TargetDir)'"
        Importance="high" />
</Target>

0 голосов
/ 29 августа 2011

Да, вы можете использовать тег «Exec» и установить его атрибут «Command» в любой цели MS Build. Откройте файл проекта в текстовом режиме, и вы можете добавить свою команду в Target, который вам может понадобиться (например, Target «BeforeBuild», если вы хотите, чтобы ваш скрипт выполнялся до Build)

EDIT:

Откройте файл проекта в текстовом режиме, перейдите в раздел: . Добавьте узел Exec в этот целевой узел. Когда вы закончите, ваш целевой узел может выглядеть так:

<Target Name="BeforeBuild">
    <Exec Command="yourscript or any DOS command" />
    ... if you had anything before in this section leave them as is
</Target>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...