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 ではない) であるという事実は、ターゲットの resx バージョンを呼び出しているだけなので、GenerateTargets ターゲットを疑います。
私は .targets ファイルの専門家ではありません。誰か手を貸してもらえますか? 私は周りをグーグルで検索しましたが、助けが見つかりませんでした。リソースは非常にまれではないため、これはかなり一般的なバグであると思います (ただし、おそらく .resx がなければそうです)。
編集:もう一度見てみると、「GenerateResources」に関連するエラーは正確には意味がありません。リソースが .resx ではないため、「CopyNonResxEmbeddedResources」で失敗するはずです。「ResxWithNoCulture」と「ResxWithCulture」のみを見ているため、GenerateResources ターゲットは .html ファイルに触れるべきではありません。
<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」は、「GenerateResources」の直前に呼び出されます