Передача ссылки на сборку в пользовательской задаче MSBuild

Я пытаюсь написать задачу MSBuild для создания базы данных с использованием сопоставлений FluentNhibernate.

Код задачи сейчас выглядит так...

public class CreateDatabase : Task
{
    [Required]
    public string ConfigFile
    { get; set; }

    [Required]
    public string MappingAssemblyName
    { get; set; }

    public override bool Execute()
    {
        var mappingAssembly = Assembly.Load(MappingAssemblyName);

        var config = new Configuration();
        config.Configure(ConfigFile);

        var fluentConfig = Fluently.Configure(config)
            .Mappings(m => m.FluentMappings.AddFromAssembly(mappingAssembly));

        var sessionSource = new SessionSource(fluentConfig);

        sessionSource.BuildSchema();

        return true;
    }
}

и использование MSBuild выглядит так...

  <ItemGroup>
    <Content Include="hibernate.cgf.xml" />
  </ItemGroup>
  <UsingTask AssemblyFile="..\lib\MyUtilities.MSBuild.dll" TaskName="CreateDatabase" />
  <Target Name="Build" >
    <CreateDatabase ConfigFile="@(Content)" MappingAssemblyName="MyMappingAssemlyName" />
  </Target>

Но теперь я застрял

Неудивительно, что Assembly.Load завершается сбоем, потому что отсутствует сборка, содержащая мои сопоставления Fluent («MyMappingAssemly»).

Предполагая, что сопоставления Fluent определены в другом проекте в моем решении, как лучше всего сообщить моей задаче MSBuild о сборке сопоставления? Я думаю, что могу пойти по неправильному пути, используя свойство MappingAssemblyName.


person sandy    schedule 27.10.2009    source источник


Ответы (1)


Я предполагаю, что вы хотите получить путь к выходным данным проекта, который определяет ваши «свободные сопоставления». Вы можете использовать цель GetTargetPath следующим образом:

<MSBuild Projects="..\path\to\projectfile" Targets="GetTargetPath">
    <Output TaskParameter="TargetOutputs" ItemName="ProjectPath"/>
</MSBuild>

Возможно, вы захотите установить конфигурацию/платформу для целевой платформы следующим образом:

Properties="Configuration=$(Configuration); Platform=$(Platform)"

Но это будет работать нормально, только если конфигурация/платформа для указанного проекта соответствует текущему проекту. Если в файле решения установлены другие значения, вам придется использовать задачу AssignProjectConfiguration.

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

person radical    schedule 27.10.2009
comment
Спасибо, Анкит, это очень помогло. Хотя казалось, что мне пришлось использовать атрибут PropertyName, а не ItemName. У меня сейчас отдельная проблема. Моя пользовательская задача зависит от других сторонних сборок. Как убедиться, что эти сборки присутствуют, когда MSBuild выполняет мою задачу? Добавленная ссылка на проект, вызывающий задачу, похоже, не помогает. - person sandy; 28.10.2009
comment