msbuild - 注入由 MSBuild 任务创建的 EmbeddedResource
问题描述
我有一个自定义 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.SomeResource.txt
我得到MyProject.obj.netstandard2._0.SomeResource.txt
注意: - 如果我在项目中替换Path.Combine
并简单地生成输出文件,它会解决资源 id 的问题,但不是第一个问题,因为它没有嵌入到第一次编译中。
如何确保我生成的文件嵌入在第一次编译中,并且我可以在 IntermediateOutputPath 中生成它们,而不是在项目目录中生成它们,就像它在项目中一样。
解决方案
您的第二个问题可以通过简单地将 LogicalName 元数据设置为创建的任务项来解决。
TaskItem taskItem = new TaskItem(ProjectCollection.Escape(outputFile));
taskItem.SetMetadata("LogicalName", $"{AssemblyName}.{item}.txt");
_generatedFiles.Add(taskItem);
现在要访问任务中的程序集名称,只需将AssemblyName
字符串属性添加MyTask
到AssemblyName="$(AssemblyName)"
目标。这应该会产生预期的结果。
推荐阅读
- javascript - 上传PDF文件找不到文件类型
- azure - 使用 ARM 模板和 azure dev ops 时的冲突
- java - 在 INSERT INTO 和 ON CONFLICT DO UPDATE 条件后 PostgreSQL “输入结束时的语法错误”
- postgresql - Visual Studio 2019/SSIS 中的 VS_NEEDSNEWMETADATA 从 PSDQL/ODBC 读取时间戳列
- java - 将 WebProxy 与 msal4j 一起使用
- java - 错误:SyntaxError:JSON 中位置 0 的意外标记 g
- c++ - 如何使用 C++ 通过 I2C 从 MPU6050 读取数据块
- python - Pygame:如何根据输入顺时针/逆时针旋转矩形
- vuetify.js - Vuetify SassError 的提示:SassError: Invalid CSS
- java - 库升级问题(1.4 到 1.8)