1

これは少しクレイジーに思えるかもしれませんが、より良い方法を教えてください。現在のバージョンの Mercurial リビジョン番号を表示する Web サービスが必要です。

この数値をテキスト ファイルに書き込む非常に単純なバッチ ファイルがあります。

cd C:\inetpub\wwwroot\MyWebsite
hg identify --num > services\version.txt 

バッチファイル呼び出してからファイルの内容を読み取り、今のところ画面に書き込むメソッド(Webページで実行していますが、後で単純なサービスに移行します)

Private Sub GetVersionNumber()
    Dim versionFile = Server.MapPath("~/services/version.txt")
    Dim batchFile = Server.MapPath("~/services/version.bat")
    Process.Start(batchFile)

    Dim revision As String = String.Empty
    Using reader As New StreamReader(versionFile)
        Do While reader.Peek() <> -1
            revision = reader.ReadLine()
        Loop
    End Using
    Response.Write(revision)
End Sub

サービスディレクトリへの書き込みアクセスを全員に許可し、version.txt で明示的に許可しましたが、ページにアクセスすると、version.txt ファイルは常に空です。ファイルをメモ帳++で開いていると、ファイルが別のプログラムによって変更されているというメッセージが表示されます。再読み込みしますか。私がするとき、それは空です。ファイルにテキストを設定して保存すると、Web ページに再度アクセスすると、テキスト ファイルの内容が消去されます。

これを try/catch ブロックに入れましたが、例外がスローされなかったため、(わかりやすくするために) 削除しました。

最終的に必要なのは、
hg identify --numの結果を取得
して、別の SharePoint サイトによって呼び出される Web ページ/サービスに文字列として表示することだけです

4

3 に答える 3

0

バッチファイルが空である理由は、この方法で開始されて実行されたプロセスは、親スレッドが存続している間のみ存続できるためです。また、usingProcess.Startは、そのプロセスが終了するのを待ちません。ドキュメントで指定されているように、このメソッドの戻り値は、プロセスが開始されたか、開始されなかったかを示すブール値です。これを無効として扱っているため、プロセスが開始されるとすぐに、プログラムは実行を継続し、終了します(Webサービスであるため)。

Webサービスがサブを終了すると、スレッドは終了し、すべての子プロセスも一緒に終了します。具体的には、現在バッチファイルを実行しているcmd.exeは、streamreaderが空のファイルを読み取っているため、実際に実行される前に終了します。

バッチファイルがかなり速く処理されることを保証できる場合は、そのバッチファイルが処理を完了するのに十分な時間Webサービス呼び出しを一時停止させるために使用をやめようとするかもしれませんThread.Sleepが、これは常に競合状態になります。

于 2012-06-14T10:36:31.627 に答える
0

ページが要求されるたびに手動で Web サーバーからバッチ ファイルを呼び出す代わりに、Mercurial 更新フックを構成して、作業コピーが更新されるたびに自動的に識別コマンドを呼び出すことができます。

たとえば、これをリポジトリの.hg\hgrcファイルに追加します。

[hooks]
update.writeversion = hg identify --num > services\version.txt

フックに関する追加情報を含むいくつかのリンク:

于 2012-06-18T10:35:09.187 に答える
0

Mercurial を直接呼び出して、標準出力ストリームから読み取ります。

var hg = new ProcessStartInfo("C:\Program Files\Mercurial\hg.exe", "identify --num -R c:\inetpub\webroot");
hg.RedirectStandardOutput = True;
hg.RedirectStandardInput = True;
hg.UseShellExecute = False;
hg.CreateNoWindow = True;

var hgProc = New Process()
hgProc.StartInfo = hg
hgProc.Start()

var repoID = hgProc.StandardOutput.ReadToEnd()
于 2012-06-15T14:05:00.237 に答える