【问题标题】:Custom task MSBuild自定义任务 MSBuild
【发布时间】:2015-11-10 10:15:46
【问题描述】:

我创建了一个解析 WSDL me 文件并将其保存到其他文件的 .dll 文件。 文件名为 WsdlParser.dll。 输入参数有:输入文件、输出文件、元素和父元素。 我需要在另一个程序中构建以调用我的 dll 并输入 MSBuild 的数据(我需要在另一个程序中构建以从 WSDL 创建这些文件)。方法解析我以创建新文件。我创建了一个项目,我在其中引用了 Microsoft.Build.Framework、Microsoft.Build.Utulities、WsdlParser。

  namespace MyParserBuild
{
    public class ParserClass : Task
    {
        private string input;
        private string output;
        private string element;
        private string parentElement;

        public override bool Execute()
        {
            try
            {
                WsdlParser.Parser parse = new WsdlParser.Parser(input, output);
                parse.Parse(parentElement, element);
            }

            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
            return true;
        }

        /*  Properties  */
        [Required]
        public string Input
        {
            get { return input; }
            set { input = value; }
        }

        [Required]
        public string Output
        {
            get { return output; }
            set { output = value; }
        }

        [Required]
        public string Element
        {
            get { return element; }
            set { element = value; }
        }

        [Required]
        public string ParentElement
        {
            get { return parentElement; }
            set { parentElement = value; }
        }
    }
}

然后我创建了一个名为 MyBuild.targets 的 XML 文件

    <?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <UsingTask TaskName="MyParserBuild.ParserClass" AssemblyFile="C:\Work\Common code\MyCode\MyParserBuild\MyParserBuild\bin\Debug\MyParserBuild.dll"/>

  <!--Variable-->
  <PropertyGroup>
    <PG_Input>C:\Work\Common code\MyCode\MyParserBuild\MyParserBuild\MyWSDLFile2.wsdl</PG_Input>
    <PG_Output>C:\Users\Administrator\Desktop\test</PG_Output>
    <PG_Element>schema</PG_Element>
    <PG_ParentElement>types</PG_ParentElement>
  </PropertyGroup>

  <Target Name="PreBuild">
    <ParserClass Input="$(PG_Input)"
                 Output="$(PG_Output)"
                 Element="$(PG_Element)"
                 ParentElement="$(PG_ParentElement)" />
  </Target>
</Project>

最后,我把这个目标放到另一个程序.csproj中。

<Import Project="C:\Work\Common code\MyCode\MyParserBuild\MyParserBuild\MyBuild.targets"/>

我的问题是,当我构建另一个程序时,不会从 WSDL 创建这些文件。

【问题讨论】:

    标签: c# msbuild msbuild-task


    【解决方案1】:

    您只导入了项目,但没有添加任何会使目标被调用的内容:并不是因为目标被命名为“PreBuild”,所以它将用作预构建事件。要做到这一点,有几个选项,这里有两个:

    1. 修改项目文件以调用 PreBuild Target,例如在文件末尾添加这个:

      <Target Name="BeforeBuild" DependsOnTargets="PreBuild">
      </Target>
      
    2. 使用 PreBuildEvent 调用目标 PreBuild。预构建事件是在命令行上运行的东西。在 Visual Studio 中,右键单击项目,选择属性,然后选择生成事件。输入

      msbuild MyBuild.targets /t:PreBuild
      

      在这种情况下,您不需要在项目中导入 MyBuild.targets。

    注意:使用像C:\Work\Common code\MyCode\... 这样的绝对路径不是一个好主意。如果您将代码复制到另一个位置,一切都会中断。更好地找出您将坚持使用的目录结构并在该结构中使用相对路径,或者将所有内容参数化,如 $(CommonCodePath)\MyBuild.targets 并将 CommonCodePath 作为属性传递给 msbuild 左右​​。

    【讨论】:

    • 谢谢,我用的是第一个选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2012-03-16
    • 2011-11-27
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 2013-03-04
    相关资源
    最近更新 更多