自定义任务 MSBuild
Custom task MSBuild
我创建了一个解析 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>
最后,我把这个target放到了另一个程序.csproj中。
<Import Project="C:\Work\Common code\MyCode\MyParserBuild\MyParserBuild\MyBuild.targets"/>
我的问题是,当我构建另一个程序时,不会从 WSDL 创建这些文件。
您只导入了项目,但没有添加任何会使目标被调用的内容:并不是因为目标被命名为 'PreBuild' 它将被用作预构建事件。为此,有几个选项,这里有两个:
修改项目文件以调用PreBuild Target,例如在文件末尾添加:
<Target Name="BeforeBuild" DependsOnTargets="PreBuild">
</Target>
使用 PreBuildEvent 调用目标 PreBuild。预构建事件类似于在命令行上运行。在 Visual Studio 中,右键单击项目,选择 select Properties,然后选择 Build Events。输入
msbuild MyBuild.targets /t:PreBuild
在这种情况下,您不需要在项目中导入 MyBuild.targets。
注意:使用像 C:\Work\Common code\MyCode\...
这样的绝对路径不是一个好主意。如果您将代码复制到另一个位置,一切都会中断。更好地找出您将坚持使用的目录结构并在该结构内使用相对路径,或者使所有参数化为 $(CommonCodePath)\MyBuild.targets
并将 CommonCodePath 作为 属性 传递给 msbuild 左右。
我创建了一个解析 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>
最后,我把这个target放到了另一个程序.csproj中。
<Import Project="C:\Work\Common code\MyCode\MyParserBuild\MyParserBuild\MyBuild.targets"/>
我的问题是,当我构建另一个程序时,不会从 WSDL 创建这些文件。
您只导入了项目,但没有添加任何会使目标被调用的内容:并不是因为目标被命名为 'PreBuild' 它将被用作预构建事件。为此,有几个选项,这里有两个:
修改项目文件以调用PreBuild Target,例如在文件末尾添加:
<Target Name="BeforeBuild" DependsOnTargets="PreBuild"> </Target>
使用 PreBuildEvent 调用目标 PreBuild。预构建事件类似于在命令行上运行。在 Visual Studio 中,右键单击项目,选择 select Properties,然后选择 Build Events。输入
msbuild MyBuild.targets /t:PreBuild
在这种情况下,您不需要在项目中导入 MyBuild.targets。
注意:使用像 C:\Work\Common code\MyCode\...
这样的绝对路径不是一个好主意。如果您将代码复制到另一个位置,一切都会中断。更好地找出您将坚持使用的目录结构并在该结构内使用相对路径,或者使所有参数化为 $(CommonCodePath)\MyBuild.targets
并将 CommonCodePath 作为 属性 传递给 msbuild 左右。