1

ビルドプロセスのカスタマイズに取り組んでいますが、興味深い動作が1つあります。文字列プロパティ関数を使用して一部の文字列を変更すると、ビルドが壊れ始めます。

たとえば、私はこのことをしようとしています:

<PropertyGroup>
    <BuildDependsOn>$(BuildDependsOn.Replace(";MyTarget", ""))</BuildDependsOn>
</PropertyGroup>

MyTargetは、BuildDependsOnプロパティから削除したいカスタムターゲットです。これを実行しようとすると、文字列が正しく削除されたように見えますが、ターゲットが存在しないというエラーが発生します(これは、Visual Studio 2010とコマンドラインMSBuildの両方で発生します)。

エラーは次のとおりです。

The target "EntityDeploy;

            BeforeBuild;
            CoreBuild;
            AfterBuild" does not exist in the project.

このプロパティを変更すると、MSBuildはその値の解析を停止し、次の1つのターゲット(空白、改行、改行を含む)を検索しようとしていると思います。

"EntityDeploy;

        BeforeBuild;
        CoreBuild;
        AfterBuild"

そして、そのようなターゲットが存在しないというエラーをスローします。

私はまた、この問題についてもっと知るためにもっと些細なことを実行しようとしました、そして私はこれを実行しようとしました:

<PropertyGroup>
    <BuildDependsOn>$(BuildDependsOn.Trim())</BuildDependsOn>
</PropertyGroup>

関数でもエラーが再発しましたTrim()。何か案が?

編集:私はデバッグして問題を見つけようとしました、そして私はこれに遭遇しました:メソッドBuildDependsOnの実行の前にプロパティをチェックするときTrim()、その値は次のようになります:

Value   "BuildDependsOn"="\r\n      EntityDeploy;\r\n      \r\n            BeforeBuild;\r\n            CoreBuild;\r\n            AfterBuild\r\n        \r\n    "
EvaluatedValue  "\r\n      EntityDeploy;\r\n      \r\n            BeforeBuild;\r\n            CoreBuild;\r\n            AfterBuild\r\n        \r\n    " string
escapedValue    "\r\n      EntityDeploy;\r\n      \r\n            BeforeBuild;\r\n            CoreBuild;\r\n            AfterBuild\r\n        \r\n    " string

メソッドの後Trim()、プロパティ値は次のようになります。

Value   "BuildDependsOn"="EntityDeploy%3b\r\n      \r\n            BeforeBuild%3b\r\n            CoreBuild%3b\r\n            AfterBuild"
EvaluatedValue  "EntityDeploy;\r\n      \r\n            BeforeBuild;\r\n            CoreBuild;\r\n            AfterBuild"   string
escapedValue    "EntityDeploy%3b\r\n      \r\n            BeforeBuild%3b\r\n            CoreBuild%3b\r\n            AfterBuild" string

セミコロン(; <=>%3b)がビルドを壊している可能性がありますか?どうすればこれを修正できますか?

4

1 に答える 1

4

私はあなたがしたこと(BuildDependsOnにトリムを追加する)を試しましたが、機能しています。

 <BuildDependsOn>
  ConfigBeforeBuild;
  $(BuildDependsOn.Trim());
  ConfigAfterBuild
</BuildDependsOn>

msbuildのデバッグを有効にしましたか?すべてがここで説明されていない場合。

わかりました、これが解決策です(私のテストも機能していませんでした、私のテストは正しくありませんでした):

<BuildDependsOn>
  $([MSBuild]::Unescape($(BuildDependsOn.Replace(";MyTarget", ""))))
</BuildDependsOn>   

%3bを削除するには、文字列のエスケープを解除する必要があります。

于 2012-04-05T07:32:56.287 に答える