C# MSBuild任务参数设置,多个参数
我在几个月的教程之后设置了一个构建任务,该教程允许使用单个命名参数 但是,我想将任务升级为包含多个参数。我有点困难 这是我当前的目标文件C# MSBuild任务参数设置,多个参数,c#,visual-studio,msbuild,C#,Visual Studio,Msbuild,我在几个月的教程之后设置了一个构建任务,该教程允许使用单个命名参数 但是,我想将任务升级为包含多个参数。我有点困难 这是我当前的目标文件 <Project> <PropertyGroup> <ThisAssembly>$(MSBuildThisFileDirectory)bin\Debug\netstandard2.0\ourapp.build.dll </ThisAssembly>
<Project>
<PropertyGroup>
<ThisAssembly>$(MSBuildThisFileDirectory)bin\Debug\netstandard2.0\ourapp.build.dll
</ThisAssembly>
<FirstRun>false</FirstRun>
<FirstRun Condition="!Exists('$(ConstantGeneratorOutputFile)')">true</FirstRun>
</PropertyGroup>
<UsingTask TaskName="ourapp.ConstantGeneratorTask"
AssemblyFile="$(ThisAssembly)" />
<!-- Pointing 'Outputs' to a non existing file will disable
up-to-date checks and run the task every time, there's probably a better way -->
<Target Name="ourapp"
BeforeTargets="BeforeCompile;CoreCompile"
Inputs="@(ConstantGeneratorSourceFiles)"
Outputs="$(ConstantGeneratorOutputFile).nocache">
<ConstantGeneratorTask
SourceFiles="@(ConstantGeneratorSourceFiles)"
OutputFile="$(ConstantGeneratorOutputFile)"
AppXamlFile="$(ConstantGeneratorAppXamlFile)"
NameSpaceName="$(ConstantGeneratorNameSpaceName)"/>
<ItemGroup Condition="Exists('$(ConstantGeneratorOutputFile)')">
<FileWrites Include="$(ConstantGeneratorOutputFile)" />
<Compile Include="$(ConstantGeneratorOutputFile)"
Condition="$(FirstRun) == 'true'" />
</ItemGroup>
</Target>
</Project>
$(MSBuildThisFileDirectory)bin\Debug\netstandard2.0\ourapp.build.dll
假的
真的
下面是读取这些参数的代码
namespace ourapp
{
public class ConstantGeneratorTask : Task
{
[Required]
public string OutputFile { get; set; } = "";
[Required]
public ITaskItem[] SourceFiles { get; set; } = Array.Empty<ITaskItem>();
[Required]
public string NameSpaceName { get; set; } = "";
[Required]
public string AppXamlFile { get; set; } = "";
名称空间应用程序
{
公共类ConstantGeneratorTask:任务
{
[必需]
公共字符串输出文件{get;set;}=”“;
[必需]
公共ITaskItem[]源文件{get;set;}=Array.Empty();
[必需]
公共字符串名称空间名称{get;set;}=”“;
[必需]
公共字符串AppXamlFile{get;set;}=”“;
这是csproj的参数
<ConstantGeneratorOutputFile>$(MSBuildThisFileDirectory)/Common/Constants.cs
</ConstantGeneratorOutputFile>
<ConstantGeneratorAppXamlFile>$(MSBuildThisFileDirectory)/App.xaml
</ConstantGeneratorAppXamlFile>
<ConstantGeneratorNameSpaceName>ourapp.Common
</ConstantGeneratorNameSpaceName>
$(MSBuildThisFileDirectory)/Common/Constants.cs
$(MSBuildThisFileDirectory)/App.xaml
普通的
我想提供这样的东西
<Items>
<Item XamlFile="$(MSBuildThisFileDirectory)/App.xaml"
NS="ourapp.Common"
OutputFile="$(MSBuildThisFileDirectory)/Common/Constants.cs" />
<Item XamlFile="$(MSBuildThisFileDirectory)/Resources/AutomationIds.xaml"
NS="ourapp.Resources"
OutputFile="$(MSBuildThisFileDirectory)/Common/AutomationIds.cs" />
</Items>
有人能给我指出正确的方向吗?您可以使用
在csproj文件中对项目进行分组,例如:
<ItemGroup>
<Xaml Include = "$(MSBuildThisFileDirectory)/App.xaml" >
<NS>ourapp.Common</NS>
<OutputFile>$(MSBuildThisFileDirectory)Common\Constants.cs</OutputFile>
</Xaml>
</ItemGroup>
<Project>
<Target Name="message" AfterTargets="build">
<Message Text="%(Xaml.OutputFile)"/>
</Target>
</Project>
更新:
cs文件:
public class Common : Task
{
[Required]
public ITaskItem[] SourceFiles
{
get
{
return sourceFiles;
}
set
{
sourceFiles = value;
}
}
[Required]
public string NS { get; set;}
[Output]
public ITaskItem[] temp { get; }
private ITaskItem[] sourceFiles;
public override bool Execute()
{
foreach (var item in SourceFiles)
{
Console.WriteLine(item.ToString());
}
Console.WriteLine(NS);
Console.WriteLine("*************Common****************");
return true;
}
}
目标文件:
<UsingTask TaskName="Common" AssemblyFile="C:\ClassLibrary1.dll" />
<Target Name="taskdll" AfterTargets="build">
<ItemGroup>
<XamlFile Include ="$(MSBuildThisFileDirectory)/App.xaml">
<NS>ourapp.common</NS>
<OutputFile>$(MSBuildThisFileDirectory)/Common/Constants.cs</OutputFile>
</XamlFile>
<XamlFile Include ="$(MSBuildThisFileDirectory)/App.xaml">
<NS>ourapp.Resources</NS>
<OutputFile>$(MSBuildThisFileDirectory)/Common/Constants.cs</OutputFile>
</XamlFile>
</ItemGroup>
<Message Text="***************START************"/>
<Common SourceFiles ="@(XamlFile);%(XamlFile.NS);%(XamlFile.OutputFile)"
NS ="%(XamlFile.NS)"
Condition ="'%(XamlFile.NS)' == 'ourapp.common'"/>
<Message Text="***************END*************"/>
</Target>
普通的
$(MSBuildThisFileDirectory)/Common/Constants.cs
我们的应用程序资源
$(MSBuildThisFileDirectory)/Common/Constants.cs
我这边的结果是:
您想从当前状态更改什么?您在定义或传递
ConstantGeneratorSourceFiles
项(例如
)时遇到问题吗?我不确定如何在csproj中对项目进行分组,以及如何读取目标文件。@Jules,我已经更新了我的答案,希望它能对您有用。这是:您需要什么?如果不是,我想用一个例子来说明我的意思会更好。啊,是的,这很有帮助,尽管我希望有一个项目组的例子,但是另一个答案有t他包含属性,这会将它们视为实际文件。或者我可以包含字符串吗?是的,你可以包含字符串,它也可以工作。你介意更新你的答案吗?你可以添加两个项目组,显示两个不同的N并添加cs吗?只是为了完整性。