繁体   English   中英

自定义任务MSBuild

[英]Custom task MSBuild

我创建了一个.dll文件来解析WSDL我的文件并将其保存到其他文件。 该文件称为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创建这些文件。

您仅导入了项目,但未添加任何使目标被调用的内容:不是因为目标名为“ 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左右。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM