1

私は nant スクリプトを持っています... 1. ディスク ファイルのコンテンツを取得します 2. そのコンテンツを nant プロパティに割り当てます 3. 次に、ディスク ファイルのコンテンツを含むそのプロパティに -v を渡して sqlcmd を呼び出します 4. SQL スクリプト内では、ファイルの内容をストアド プロシージャで使用する必要があります。

問題は、ファイルの内容にスペースが含まれている場合、nant ビルドが「無効な引数」の問題で停止することです。

これを回避する方法を知っている人はいますか?

ナントスクリプトの先頭部分は……

<?xml version="1.0"?>
<!-- the main name of this project -->
<project name="Hops" default="all">
  <!-- BuildHistory -->
  <property name="buildHistoryContents" value="" />
  <xmlpeek xpath="/" file="BuildNotes.xml" property="buildHistoryContents"></xmlpeek>
  <!-- <echo message="${buildHistoryContents}" /> -->

  <!-- ***************** -->
  <target name="ExecSql">
    <echo message="running sql script : ${SqlBuildScriptsDir}${sqlBuildFileName}" />
    <exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=${buildHistoryContents}  " />
  </target>

SQLスクリプトには次の行が含まれています...

exec lsp_SchemaVersionUpsert '1.4', N'$(vSchemaVersion)'

動作するディスク ファイルの内容は...

<BuildNotes>
  <Note>
    <buildVer>HasNotSpace</buildVer>
  </Note>
</BuildNotes>

動作しないディスク ファイルの内容は...

<BuildNotes>
  <Note>
    <buildVer>Has Space</buildVer>
  </Note>
</BuildNotes>

これらすべての使用は、db スキーマのバージョン ビルド履歴を記録するテーブルに xml ビルド コメントを渡すことです。

誰かが別の方法を知っているか、これを通る方法を知っていますか?

Phillip Keeley が最初の部分 (スペース問題) を解決した後に追加された次の部分は、質問を単純化するために元のタスクを単純化しました。

引用属性の問題もあります。xml で引用された属性により、nant ビルドが「無効な引数」で失敗します。

たとえば、これにより nant がチョークしますが、dt 属性を削除すると、nant ビルドが成功するようになります ...

<BuildNotes>
  <Note>
    <buildVer>1.4</buildVer>
    <dateStarted>09/24/2009 11:25:42</dateStarted>
    <Item dt="20091008" >SpacesAndNoQuotedAttribute</Item>
  </Note>
</BuildNotes>

何か案は ... ?

4

1 に答える 1

2

あなたの問題は(もちろん)並んでいます

<exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=${buildHistoryContents}  " />

具体的には、

-v vSchemaVersion=${buildHistoryContents}

NAnt 式は、プロパティ ${buildHistoryContents} を保存された値に置き換えます。これには、埋め込まれたスペースが含まれます。問題は、コマンド ウィンドウから SQLCMD (${SqlCmd} が解決されると仮定しています) を呼び出すときに、すべての -v パラメータの値がスペースで区切られていることです。つまり、パーサーが -v にヒットし、変数名として「=」までの次の文字を入力し、= の後のすべての文字と次のスペース (または行末) までを変数に割り当てる値として読み取ります。

コマンド ラインでの回避策は、変数値を引用符で囲むことです。

 - v MyVariable=Hello World

になる

 - v MyVariable="Hello World"

これはここでは機能しません。これは XML であり、 exec要素のコマンドライン属性を引用符で囲む必要があるためです。また、引用符が埋め込まれていると、大きな問題が発生します。

ここでの回避策は、埋め込まれた引用符に対して XML マクロ置換を使用することだと思います (これらの概念の正式なタイトルが間違っている可能性が非常に高いです)。この値は

&quot;

つまり、次のように動作する必要があります。

<exec program="${SqlCmd}" commandline="-S ${SqlServerInstanceName} -E -d HBus -i ${SqlBuildScriptsDir}${sqlBuildFileName} -v vSchemaVersion=&quot;${buildHistoryContents}&quot;  " />

これを試してみてください。近いうちに自分でこのようなことをしなければならないかもしれません。

于 2009-11-09T15:34:04.627 に答える