Xbuild (.html)资源文件失败

本文关键字:源文件 失败 资源 html Xbuild | 更新日期: 2023-09-27 18:16:38

我有一个问题得到xbuild编译一个web应用程序项目。我们有一些资源文件,它们是。html文件。

当前失败的是'KwasantCore'Resources'HTMLEventInvitation.html'

资源在KwasantCore中定义。csproj

<Content Include="Resources'HTMLEventInvitation.html" />

在ubuntu上构建时,文件位于这里:

/home/gitlab_ci_runner/gitlab-ci-runner/tmp/builds/project-1/KwasantCore/Resources/HTMLEventInvitation.html

当运行xbuild时,我得到这个错误:

/home/gitlab_ci_runner/gitlab-ci-runner/tmp/builds/project-1/Kwasant.sln (default targets) ->
(Build target) ->
/home/gitlab_ci_runner/gitlab-ci-runner/tmp/builds/project-1/KwasantCore/KwasantCore.csproj (default targets) ->
/usr/lib/mono/xbuild/12.0/bin/Microsoft.Common.targets (GenerateResources target) ->
    /usr/lib/mono/xbuild/12.0/bin/Microsoft.Common.targets: error : Tool exited with code: 1. Output: Error: Invalid ResX input.
Position: Line 123, Column 5.
Inner exception: Could not find a part of the path "/home/gitlab_ci_runner/gitlab-ci-runner/tmp/builds/project-1/KwasantCore/resources/htmleventinvitation.html".

我检查了文件,它在那里-问题是大小写敏感。资源在.csproj中被正确引用,因此在一行中的某个地方,资源从'Resources/HTMLEventInvitation.html'小写到'resources/htmleventinvitation.html'

我看了一下ubuntu系统上的Microsoft.Common.targets文件。第125行是完全不相关的(它显示了</PropertyGroup>)。查看generaterresources目标,它显示了如下内容:

<Target Name = "GenerateResources">
        <GenerateResource
            Sources = "@(ResxWithNoCulture)"
            UseSourcePath = "true"
            OutputResources = "@(ManifestResourceWithNoCultureName->'$(IntermediateOutputPath)%(Identity).resources')"
            Condition = "'@(ResxWithNoCulture)' != '' ">
            <Output TaskParameter = "OutputResources" ItemName = "ManifestResourceWithNoCulture"/>
            <Output TaskParameter = "FilesWritten" ItemName = "FileWrites"/>
        </GenerateResource>
        <GenerateResource
            Sources = "@(ResxWithCulture)"
            UseSourcePath = "true"
            OutputResources = "@(ManifestResourceWithCultureName->'$(IntermediateOutputPath)%(Identity).resources')"
            Condition = "'@(ResxWithCulture)' != '' ">
            <Output TaskParameter = "OutputResources" ItemName = "ManifestResourceWithCulture"/>
            <Output TaskParameter = "FilesWritten" ItemName = "FileWrites"/>
        </GenerateResource>
    </Target>

,引用的目标是:

<CreateItem Include="@(ResourcesWithNoCulture)" Condition="'%(Extension)' == '.resx'">
    <Output TaskParameter="Include" ItemName="ResxWithNoCulture"/>
</CreateItem>
<CreateItem Include="@(ResourcesWithNoCulture)" Condition="'%(Extension)' != '.resx'">
    <Output TaskParameter="Include" ItemName="NonResxWithNoCulture"/>
</CreateItem>
<CreateItem Include="@(ResourcesWithCulture)" Condition="'%(Extension)' == '.resx'">
    <Output TaskParameter="Include" ItemName="ResxWithCulture"/>
</CreateItem>
<CreateItem Include="@(ResourcesWithCulture)" Condition="'%(Extension)' != '.resx'">
    <Output TaskParameter="Include" ItemName="NonResxWithCulture"/>
</CreateItem>

现在,这对我来说看起来很可疑,但我无法弄清楚这些Include="@(ResourcesWithNoCulture)"行在做什么-在其他地方搜索它们没有给我任何提示。事实上,它是一个。html文件(而不是。resx),这让我怀疑GenerateTargets目标,因为它只调用目标的resx版本。

我不是。targets文件的专家,谁能帮我一下?我用谷歌搜索了一下,但没有找到任何帮助。我认为这将是一个相当常见的错误,因为资源并不是非常罕见(但也许没有.resx它们是)。

编辑:再看一遍,与"generaterresources"相关的错误并不完全有意义:它应该在"CopyNonResxEmbeddedResources"失败,因为资源不是。resx。他们的generaterresources目标不应该触及。html文件-因为它只看'ResxWithNoCulture'和'ResxWithCulture'

<Target Name = "CopyNonResxEmbeddedResources"
        Condition = "'@(NonResxWithCulture)' != '' or '@(NonResxWithNoCulture)' != '' or '@(ManifestNonResxWithCulture)' != '' or '@(ManifestNonResxWithNoCulture)' != ''">
        <MakeDir Directories="$(IntermediateOutputPath)%(ManifestNonResxWithCulture.Culture)"/>
        <Copy SourceFiles = "@(NonResxWithCulture)"
            DestinationFiles = "@(ManifestNonResxWithCulture->'$(IntermediateOutputPath)%(Identity)')"
            SkipUnchangedFiles="$(SkipCopyUnchangedFiles)">
            <Output TaskParameter = "DestinationFiles" ItemName = "ManifestNonResxWithCultureOnDisk"/>
            <Output TaskParameter = "DestinationFiles" ItemName = "FileWrites"/>
        </Copy>
        <Copy SourceFiles = "@(NonResxWithNoCulture)"
            DestinationFiles = "@(ManifestNonResxWithNoCulture->'$(IntermediateOutputPath)%(Identity)')"
            SkipUnchangedFiles="$(SkipCopyUnchangedFiles)">
            <Output TaskParameter = "DestinationFiles" ItemName = "ManifestNonResxWithNoCultureOnDisk"/>
            <Output TaskParameter = "DestinationFiles" ItemName = "FileWrites"/>
        </Copy>
    </Target>

目标'CopyNonResxEmbeddedResources'直接在' generaterresources '之前调用

Xbuild (.html)资源文件失败

我不知道为什么会发生这种情况(我的大脑无法容纳更多构建系统配置的细微差别),但我在此过程中学到的一个技巧是:

MONO_IOMAP=case xbuild ...

该环境变量告诉Mono在搜索文件时不区分大小写。Mono文档使用它来解决跨Windows <-> Mac <-> Linux文件系统的大小写敏感移植,但是MONO_IOMAP功能提供了几个其他的文件系统和I/O映射操作。

如果不工作,您可以尝试ciopfs,这是一个Linux用户空间不区分大小写的文件系统。我从来没用过

我不能告诉你为什么它会这样做,但我的解决方案是改变资源的名称以匹配它正在寻找的内容。

它看起来像是在尝试处理一些东西,如Resx…

 Tool exited with code: 1. Output: Error: Invalid ResX input.
也许检查一下你的设置?

编译器试图将此解释为资源文件而不是资源。资源文件是一个。txt或。resx文件,用于以特定格式指定资源(例如字符串,图像),而不是资源本身。

GenerateResource任务根本不应该在资源上运行,因为它的目的是将。txt或。resx文件转换为。resource文件,以便嵌入到程序集中。

如果没有实际的资源文件(.txt或.resx),那么您应该从项目的构建中完全删除该任务。否则,您只需要确保只将正确的文件传递给它。如果不能够看到更多的配置,我无法确切地告诉您如何做到这一点,但这是一个常见的配置任务,因此您应该能够在Google上找到指导。