gpt4 book ai didi

c# - xbuild 因 (.html) 资源文件而失败

转载 作者:行者123 更新时间:2023-11-30 16:10:48 30 4
gpt4 key购买 nike

我在让 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> )。查看 GenerateResources 目标,它向我展示了这一点:

<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,它们可能是稀有的)。

编辑:再次查看后,与“GenerateResources”相关的错误并不完全有意义:它应该在“CopyNonResxEmbeddedResources”处失败,因为资源不是 .resx。他们的 GenerateResources 目标不应该触及 .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>

在“GenerateResources”之前直接调用目标“CopyNonResxEmbeddedResources”

最佳答案

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

MONO_IOMAP=case xbuild ...

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

如果不行,你可以试试ciopfs ,这是一个 Linux 用户空间不区分大小写的文件系统。不过,我从未使用过它。

关于c# - xbuild 因 (.html) 资源文件而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25157045/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com