3

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」の直前に呼び出されます

4

3 に答える 3

0

なぜそうしているのかはわかりませんが、私の解決策は、探しているものと一致するようにリソースの名前を変更することです。

何かを Resx として処理しようとしているように見えます...

 Tool exited with code: 1. Output: Error: Invalid ResX input.

多分あなたの設定を確認してください?

于 2014-08-15T13:23:12.727 に答える