我在获取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文件的专家 - 任何人都可以帮忙吗?我已经用Google搜索过,但没有找到任何帮助。我认为这将是一个相当常见的错误,因为资源并不是非常罕见(但可能没有.resx)。
编辑:再次查看,错误与“生成资源”相关。并不完全有意义:它应该在CopyNonResxEmbeddedResources&#39;中失败,因为资源不是.resx。他们的GenerateResources目标不应该触及.html文件 - 因为它只关注ResxWithNoCulture&#39;&#39; ResxWithNoCulture&#39;和&#39; ResxWithCulture&#39;
<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>
目标&#39; CopyNonResxEmbeddedResources&#39;在GenerateResources&#39;
之前直接调用答案 0 :(得分:3)
我不知道为什么会发生这种情况(我的大脑不能再拥有更多的构建系统和配置细微差别),但我一路上采取的其中一个技巧是:
MONO_IOMAP=case xbuild ...
该环境变量告诉Mono在搜索文件时不区分大小写。 Mono documentation使用它来解决跨Windows的区分大小写的移植&lt; - &gt; Mac&lt; - &gt; Linux文件系统,但MONO_IOMAP
工具提供了其他几个文件系统和I / O映射操作。
如果不起作用,您可以尝试ciopfs
,这是一个Linux用户空间不区分大小写的文件系统。但是,我从未使用它。
答案 1 :(得分:0)
我无法告诉你它为什么这样做,但我的解决方案是更改资源的名称以匹配它所寻找的内容。
它看起来像是在试图处理Resx ......
Tool exited with code: 1. Output: Error: Invalid ResX input.
也许检查一下你的设置?
答案 2 :(得分:0)
编译器正在尝试将其解释为资源文件而不是资源。资源文件是.txt或.resx文件,用于指定特定格式的资源(例如字符串,图像),而不是资源本身。
GenerateResource
任务根本不应该在资源上运行,因为它的目的是将.txt或.resx文件转换为.resource文件,以嵌入到程序集中。
如果没有实际的资源文件(.txt或.resx),那么您应该完全从项目的构建中删除该任务。否则,您只需要确保只传递正确的文件。我无法在不能看到更多配置的情况下告诉您如何执行此操作,但这是一项常见的配置任务,因此您应该能够在Google上找到相关指南。