strings.xmlにエスケープされていないアポストロフィがある場合、ビルドを失敗させる方法は?

降順:

私はAndroidアプリを持っています。このアプリの場合、crowdin.comから翻訳を自動的にダウンロードします-これはうまくいきます。

一部の言語ではアポストロフィを使用しており、strings.xmlにアポストロフィがある場合はエスケープする必要があることがわかっています

私が探しているのは、さまざまなstrings.xmlにエスケープされていないアポストロフィがあるとビルド失敗することです。

具体的には、内のすべてのstrings.xmlを検索先頭にが付いていないsrc/main/res/ファイルが含まれている場合は、エラーをスローします。私はそれについて知ることができ、翻訳者と一緒にソースで翻訳を修正できるので、これは私にとって理想的です。'\

あるいは、エスケープされていないアポストロフィを置き換えることを探していますが、ビルド自体の一部として自動化された方法で行います。

アンディ:

これは、「preBuild」の前に実行されるgradleタスクの簡単な例で、エスケープされていないアポストロフィを含む文字列値を見つけるために、見つかったすべてのstrings.xmlをチェックします。エラーが見つかった場合、ビルドは失敗します。ダウンロードタスクの必要に応じて依存関係を変更します。

(スクリプトは最初に発生したエラーで失敗することに注意してください。enバージョンとesバージョンの両方にエラーがある場合、1つのファイルのみがエラーとして報告されます。)

(注2 XMLパーサーが使用されるため、文字列タグ付きの値のみが処理され、結果としてxmlコメントの違反も無視されます。これは、エラーのない最初のテストケースで明らかです。)

(モジュール:アプリ(build.gradle))

task checkUnescapedApostrophes {
    doFirst {

        println("checkUnescapedApostrophes")

        fileTree("src").matching {
            include "**/strings.xml"
        }.each {
            def stringsFile = it
            def parser = (new XmlParser()).parse(stringsFile)
            println("Processing file: "+stringsFile)
            parser.'string'.each { m ->
                def s = m.text()
                def ss = "[^\\\\]\'"
                println "[" + m.@name + "]: " + s
                if (s =~ ss) {
                    throw new GradleException(
                        "Found a string value in " + stringsFile + 
                        " have unescaped apostrophe: "+s)
                }
            }
        }
        println("strings.xml OK")
    }
}

preBuild.dependsOn(checkUnescapedApostrophes)

strings.xmlのエラーのない場合(デフォルトのロケール+ es):

<resources>
<!--    <string name="test">some value with '</string> -->
    <string name="test2">some with escaped \'</string>
</resources>

<resources>
    <!--    <string name="test">algún valor con apóstrofe sin escape '</string> -->
    <string name="test2">algún valor con el apóstrofe escapado \'</string>
</resources>

ビルド出力:

> Configure project :app
checkUnescapedApostrophes
Processing file: ...\app\src\main\res\values\strings.xml
[test2]: some with escaped \'
Processing file: ....\app\src\main\res\values-es\strings.xml
[test2]: algún error con el apóstrofe escapado \'    
strings.xml OK

> Task :app:checkUnescapedApostrophes UP-TO-DATE
> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:checkDebugManifest UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:prepareLintJar UP-TO-DATE
> Task :app:prepareLintJarForPublish UP-TO-DATE
> Task :app:generateDebugSources UP-TO-DATE

BUILD SUCCESSFUL in 1s
4 actionable tasks: 4 up-to-date

また、strings.xmlのエラーの場合(デフォルトではローカルおよびes)

<resources>
    <string name="test">some value with '</string>
    <string name="test2">some with escaped \'</string>
</resources>

<resources>
    <string name="test">algún valor con apóstrofe sin escape '</string>
    <string name="test2">algún valor con el apóstrofe escapado \'</string>
</resources>

(上記の場合、エスケープされていないアポストラフィはスタジオでエラーが発生し、期待どおりにフラグが立てられることに注意してください。)

ビルド出力:

> Configure project :app
checkUnescapedApostrophes
Processing file: ...\app\src\main\res\values\strings.xml
[test]: some value with '

FAILURE: Build failed with an exception.

* Where:
Build file '...\app\build.gradle' line: 43

* What went wrong:
A problem occurred evaluating project ':app'.
> Found a string value in ...\app\src\main\res\values\strings.xml have unescaped apostrophe: some value with '

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1s

一般的なGradleのメモ:自分でテストしてbuild.gradleを変更する場合は、「Build Project」だけでなく、「Rebuild Project」を使用してください。以前にビルドが失敗した場合、gradleの変更が反映されないようです。


また、あなたが言及した代替案として、このタスクは、見つかったすべてのstrings.xmlを置き換えることにより、エスケープされていないアポストロフィをエスケープします。これはインプレース更新です-より堅牢なアプローチがあります:https : //stackoverflow.com/a/48356111/2711811

task replaceUnescapedApostrophes {
    doFirst {
        ant.replaceregexp(match: "([^\\\\])'", replace: "\\1\\\\\\\\'",  byline: "true") {
            fileset(dir: 'src/', excludes: '*', includes: '**/*strings.xml')
        }
    }
}

//preBuild.dependsOn(checkUnescapedApostrophes)
preBuild.dependsOn(replaceUnescapedApostrophes)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

strings.xmlのエントリが重複しているため、Gradleビルドが失敗します

分類Dev

タイトルにエスケープされていないアポストロフィ( ')が含まれている場合、pywikibot.Page(site、title).textを使用するにはどうすればよいですか?

分類Dev

strings.xmlの文字列が使用されている場所を知る方法

分類Dev

WPFアプリケーションのコントロールがフォーカスされている場合、アクティブなウィンドウタイトルのキャプチャに失敗しました

分類Dev

「ここでは翻訳されていますが、デフォルトのロケールでは見つかりません」translatable = "false"を含むstrings.xmlのエラー

分類Dev

f-stringsが実装されているときにSyntaxErrorをキャッチする方法-廃止されたpythonが使用されている場合

分類Dev

テストが実行されなかった場合にJenkinsビルドを失敗させる方法は?

分類Dev

テストが実行されなかった場合にJenkinsビルドを失敗させる方法は?

分類Dev

反応ビルドアプリケーションがapachetomcatにデプロイされている場合のパスエラーを修正する方法

分類Dev

フィールドがスキーマにない場合にマングースを失敗させる方法は?

分類Dev

コードに例外がある場合、Junitテストケースを失敗させる方法は?

分類Dev

Swift:ストーリーボードでのローカリゼーション-ラベルがMain.stringsに追加されていませんか?

分類Dev

エスケープ(\ ')しない限り、アポストロフィ(')を一致させる方法は?

分類Dev

app-nameがInfoPlist.stringsでローカライズされている場合、構成に応じて異なるapp-name

分類Dev

Localizable.strings(ベース)ファイル文字列がiPhoneに設定されている他の言語で読み取られませんか?

分類Dev

HTMLコードにランダムなテキストが含まれている場合にjQueryフィルターを機能させる方法は?

分類Dev

SSISパッケージは、「64ビットドライバーがインストールされていない場合は、32ビットモードで実行する」というエラーで失敗します。

分類Dev

Travis CI:アーティファクトをS3にアップロードすると、「アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要があります」という結果になります。

分類Dev

「Windowsは指定されたデバイス、パス、またはファイルにアクセスできません」という通常のプロセスが失敗した場合、抗ウイルスソフトウェア(アバスト)をアンインストールする方法は?

分類Dev

ビジュアルスタジオのコードブレークポイントが灰色に設定されていて機能しない。エラー(「justMyCode」オプションのために除外される場合がある)

分類Dev

PHP:ファイルが選択されていない場合にファイルのアップロードをスキップする方法

分類Dev

ソリューションファイル内のプロジェクトにMsBuildプロパティが設定されている場合、カスタムコンパイルエラーをスローする方法はありますか?

分類Dev

テストプログラムで文字列を追加する場合、strings.Builderがfmt.Sprintよりも遅いのはなぜですか?

分類Dev

特定のカテゴリが選択されている場合、チェックアウトページのカスタムドロップダウンフィールドを非表示にする方法はありますか?

分類Dev

プロファイル用に構成されたマイクが接続されていない場合、Dragon NaturallySpeaking 12.5で音声コマンドをエクスポートするにはどうすればよいですか?

分類Dev

Android:strings.xmlからリストビューに値を取得する方法は?

分類Dev

pytest:特定のフィクスチャがロードされている場合にのみセットアップコードを実行する方法

分類Dev

ASP.netビューステートMACの検証に失敗しました。このアプリケーションがWebファームまたはクラスターによってホストされている場合

分類Dev

アーティファクトがアーティファクトにアップロードされていない場合、Jenkinsビルドに失敗します

Related 関連記事

  1. 1

    strings.xmlのエントリが重複しているため、Gradleビルドが失敗します

  2. 2

    タイトルにエスケープされていないアポストロフィ( ')が含まれている場合、pywikibot.Page(site、title).textを使用するにはどうすればよいですか?

  3. 3

    strings.xmlの文字列が使用されている場所を知る方法

  4. 4

    WPFアプリケーションのコントロールがフォーカスされている場合、アクティブなウィンドウタイトルのキャプチャに失敗しました

  5. 5

    「ここでは翻訳されていますが、デフォルトのロケールでは見つかりません」translatable = "false"を含むstrings.xmlのエラー

  6. 6

    f-stringsが実装されているときにSyntaxErrorをキャッチする方法-廃止されたpythonが使用されている場合

  7. 7

    テストが実行されなかった場合にJenkinsビルドを失敗させる方法は?

  8. 8

    テストが実行されなかった場合にJenkinsビルドを失敗させる方法は?

  9. 9

    反応ビルドアプリケーションがapachetomcatにデプロイされている場合のパスエラーを修正する方法

  10. 10

    フィールドがスキーマにない場合にマングースを失敗させる方法は?

  11. 11

    コードに例外がある場合、Junitテストケースを失敗させる方法は?

  12. 12

    Swift:ストーリーボードでのローカリゼーション-ラベルがMain.stringsに追加されていませんか?

  13. 13

    エスケープ(\ ')しない限り、アポストロフィ(')を一致させる方法は?

  14. 14

    app-nameがInfoPlist.stringsでローカライズされている場合、構成に応じて異なるapp-name

  15. 15

    Localizable.strings(ベース)ファイル文字列がiPhoneに設定されている他の言語で読み取られませんか?

  16. 16

    HTMLコードにランダムなテキストが含まれている場合にjQueryフィルターを機能させる方法は?

  17. 17

    SSISパッケージは、「64ビットドライバーがインストールされていない場合は、32ビットモードで実行する」というエラーで失敗します。

  18. 18

    Travis CI:アーティファクトをS3にアップロードすると、「アクセスしようとしているバケットは、指定されたエンドポイントを使用してアドレス指定する必要があります」という結果になります。

  19. 19

    「Windowsは指定されたデバイス、パス、またはファイルにアクセスできません」という通常のプロセスが失敗した場合、抗ウイルスソフトウェア(アバスト)をアンインストールする方法は?

  20. 20

    ビジュアルスタジオのコードブレークポイントが灰色に設定されていて機能しない。エラー(「justMyCode」オプションのために除外される場合がある)

  21. 21

    PHP:ファイルが選択されていない場合にファイルのアップロードをスキップする方法

  22. 22

    ソリューションファイル内のプロジェクトにMsBuildプロパティが設定されている場合、カスタムコンパイルエラーをスローする方法はありますか?

  23. 23

    テストプログラムで文字列を追加する場合、strings.Builderがfmt.Sprintよりも遅いのはなぜですか?

  24. 24

    特定のカテゴリが選択されている場合、チェックアウトページのカスタムドロップダウンフィールドを非表示にする方法はありますか?

  25. 25

    プロファイル用に構成されたマイクが接続されていない場合、Dragon NaturallySpeaking 12.5で音声コマンドをエクスポートするにはどうすればよいですか?

  26. 26

    Android:strings.xmlからリストビューに値を取得する方法は?

  27. 27

    pytest:特定のフィクスチャがロードされている場合にのみセットアップコードを実行する方法

  28. 28

    ASP.netビューステートMACの検証に失敗しました。このアプリケーションがWebファームまたはクラスターによってホストされている場合

  29. 29

    アーティファクトがアーティファクトにアップロードされていない場合、Jenkinsビルドに失敗します

ホットタグ

アーカイブ