在自定义MSBuild任务中传递程序集引用

时间:2009-10-27 16:25:40

标签: msbuild fluent-nhibernate

我正在尝试使用FluentNhibernate映射编写MSBuild任务来构建数据库。

该任务的代码目前看起来像这样......

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'属性走错路。

1 个答案:

答案 0 :(得分:1)

我假设您想要获得项目输出的路径,该项目定义了您的“流畅映射”。您可以像这样使用'GetTargetPath'目标:

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

您可能希望为目标平台设置配置/平台,如下所示:

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

但是只有当引用项目的config / platform与当前项目匹配时,这才能正常工作。如果解决方案文件设置了不同的值,则必须使用AssignProjectConfiguration任务。

因为,我不确定这是否正是你想要的,如果需要的话,我会在这里停下来添加更多信息。