我正在尝试使用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'属性走错路。
答案 0 :(得分:1)
我假设您想要获得项目输出的路径,该项目定义了您的“流畅映射”。您可以像这样使用'GetTargetPath'目标:
<MSBuild Projects="..\path\to\projectfile" Targets="GetTargetPath">
<Output TaskParameter="TargetOutputs" ItemName="ProjectPath"/>
</MSBuild>
您可能希望为目标平台设置配置/平台,如下所示:
Properties="Configuration=$(Configuration); Platform=$(Platform)"
但是只有当引用项目的config / platform与当前项目匹配时,这才能正常工作。如果解决方案文件设置了不同的值,则必须使用AssignProjectConfiguration任务。
因为,我不确定这是否正是你想要的,如果需要的话,我会在这里停下来添加更多信息。