首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >注入由MSBuild任务创建的EmbeddedResource

注入由MSBuild任务创建的EmbeddedResource
EN

Stack Overflow用户
提问于 2018-04-26 13:43:29
回答 2查看 678关注 0票数 2

我有一个自定义的MSBuild任务,它基于没有构建操作的文件生成一个文件。生成的文件需要嵌入到最终的程序集中。该任务如下所示:

代码语言:javascript
复制
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)));
            }
        }
    }
}

在我的目标文件中,我定义了一个目标,如下所示:

代码语言:javascript
复制
<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>

我最终得到了两个我似乎无法解决的问题:

  1. 尽管这些文件是在编译任务之前生成的,但它不会嵌入到程序集中,除非我在不清理输出的情况下重新生成项目。在随后的构建中,该文件是嵌入的。
  2. 如果我在IntermediateOutputPath中生成文件,则嵌入的资源id将包含该路径。所以我得到的是MyProject.obj.netstandard2._0.SomeResource.txt

,而不是MyProject.SomeResource.txt

注意:-如果我替换Path.Combine并在项目中简单地生成输出文件,它修复了资源id的问题,但不是第一个问题,因为它没有嵌入到第一次编译中。

如何确保我生成的文件被嵌入到第一次编译中,并且我可以在IntermediateOutputPath而不是项目目录中生成它们,就像它在项目中一样。

EN

回答 2

Stack Overflow用户

发布于 2018-05-31 17:15:44

您需要在管道中更早地运行您的目标。CoreCompile为时已晚。

您可以将以下内容添加到.csproj文件中。此目标将在ResolveReferences之前运行,并将Image.png添加为嵌入式资源。

代码语言:javascript
复制
<Target Name="IncludeDynamicResources" BeforeTargets="ResolveReferences">
    <ItemGroup>
      <EmbeddedResource Include="Image.png">
        <Type>Non-Resx</Type>
      </EmbeddedResource>
    </ItemGroup>
</Target>
票数 0
EN

Stack Overflow用户

发布于 2019-01-25 00:56:03

您的第二个问题可以通过简单地将LogicalName元数据设置为创建的任务项来解决。

代码语言:javascript
复制
TaskItem taskItem = new TaskItem(ProjectCollection.Escape(outputFile));   
taskItem.SetMetadata("LogicalName", $"{AssemblyName}.{item}.txt");
_generatedFiles.Add(taskItem);

现在,要访问任务中的程序集名称,只需向MyTask添加AssemblyName字符串属性,向目标添加AssemblyName="$(AssemblyName)"。这应该会产生预期的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50035598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档