如何为VS2012 C#Project执行自定义构建步骤?

gap*_*gap 3 c# msbuild visual-studio-2012

我们有一个VS2012解决方案,其中包含十几个C#项目.其中一个C#项目使用了一个文本文件,该文件由我们编写的单独的C#工具转换为SQL.我们希望在TXT文件发生更改(发布和调试版本)时,在构建期间自动调用此TXT-2-SQL文件转换.

此外,我们希望Debug构建能够将SQL加载到本地DB中; 即,调用我们现有的批处理文件之一populate_db.bat,将SQL文件名作为参数(这只是包装mysql客户端的调用并导致执行SQL).

最好的方法是什么?

gap*_*gap 6

根据我自己的研究,我发现了以下选择:

  1. 自定义MSBuild任务 - 创建一个包含实现ITask的类的单独程序集; 从我们的csproj中引用它; 让该任务完成刚才描述的工作.
  2. 自定义构建工具(单个文件生成器) - 创建一个单独的程序集,其中包含一个实现IVsSingleFileGenerator的类; 在每台开发机器上注册; 在我们现有的csproj中上述TXT文件的属性中的"自定义构建工具"项中使用该工具名称
  3. C++ Makefile项目 - 在一个空的C++ Makefile项目中使用CustomBuild或CustomBuildTool语句; 在其他项目文件中包含感兴趣的TXT文件; 将该项目添加到解决方案.
  4. 目标+执行 - 将自定义目标节点添加到现有的csproj:

    <Target Name ="TXT2DB"AfterTargets ="Build"Condition ="'$(Configuration)'=='Debug'"Inputs ="MyTextFile.txt"
    Outputs ="MySqlFile.sql"Label ="TXT2DB"> <Exec Command ="$(ProjectDir)\ Tools\txt2sql\txt2sql.exe MyTextFile.txt MySqlFile.sql"/> <Exec Command ="populate_db.bat MySqlFile.sql"/> </ Target>

  5. 后期构建事件 - 使用后期构建事件.提到完整性,但丢弃的b/c它在调试和发布中都会发生,并且似乎对TXT文件更改不敏感.

目前,我们选择#4作为最容易实现和维护解决方案,并满足所有要求.