我有一个自定义的MSBuild任务,它基于没有构建操作的文件生成一个文件。生成的文件需要嵌入到最终的程序集中。该任务如下所示:
public class MyTask : Task
{
public string OutputDirectory { get; set; }
public string[] NoneIncluded { get; set; }
private IEnumerable<ITaskItem> _generatedFiles;
[Output]
public ITaskItem[] GeneratedFiles => _generatedFiles.ToArray();
public override bool Execute()
{
_generatedCssFiles = new List<ITaskItem>();
foreach(var item in NoneIncluded)
{
if(someCondition)
{
var contents = DoFoo(item);
var outputPath = Path.Combine(OutputDirectory, $"{item}.txt");
File.WriteAllText(outputPath, contents);
_generatedFiles.Add(new TaskItem(ProjectCollection.Escape(outputFile)));
}
}
}
}
在我的目标文件中,我定义了一个目标,如下所示:
<PropertyGroup>
<CoreCompileDependsOn>MyTarget;$(CoreCompileDependsOn);</CoreCompileDependsOn>
</PropertyGroup>
<Target Name="MyTarget"
BeforeTargets="CoreCompile;Build">
<MyTask OutputDirectory="$(IntermediateOutputPath)"
NoneIncluded="@(None)">
<Output ItemName="FilesWrite"
TaskParameter="GeneratedFiles"/>
<Output ItemName="EmbeddedResource"
TaskParameter="GeneratedFiles" />
</MyTask>
</Target>
我最终得到了两个我似乎无法解决的问题:
IntermediateOutputPath
中生成文件,则嵌入的资源id将包含该路径。所以我得到的是MyProject.obj.netstandard2._0.SomeResource.txt
,而不是MyProject.SomeResource.txt
注意:-如果我替换Path.Combine
并在项目中简单地生成输出文件,它修复了资源id的问题,但不是第一个问题,因为它没有嵌入到第一次编译中。
如何确保我生成的文件被嵌入到第一次编译中,并且我可以在IntermediateOutputPath而不是项目目录中生成它们,就像它在项目中一样。
发布于 2018-05-31 17:15:44
您需要在管道中更早地运行您的目标。CoreCompile
为时已晚。
您可以将以下内容添加到.csproj
文件中。此目标将在ResolveReferences
之前运行,并将Image.png
添加为嵌入式资源。
<Target Name="IncludeDynamicResources" BeforeTargets="ResolveReferences">
<ItemGroup>
<EmbeddedResource Include="Image.png">
<Type>Non-Resx</Type>
</EmbeddedResource>
</ItemGroup>
</Target>
发布于 2019-01-25 00:56:03
您的第二个问题可以通过简单地将LogicalName元数据设置为创建的任务项来解决。
TaskItem taskItem = new TaskItem(ProjectCollection.Escape(outputFile));
taskItem.SetMetadata("LogicalName", $"{AssemblyName}.{item}.txt");
_generatedFiles.Add(taskItem);
现在,要访问任务中的程序集名称,只需向MyTask
添加AssemblyName
字符串属性,向目标添加AssemblyName="$(AssemblyName)"
。这应该会产生预期的结果。
https://stackoverflow.com/questions/50035598
复制相似问题