3

質問のタイトルは、私が求めているものをきちんとまとめていると思います。Web アプリとサービスがあり、前回のビルド以降にサービスが更新されているかどうかをビルド スクリプトで確認し、更新されている場合は、サービスを右クリックしたときに利用できる「サービス参照の更新」スクリプトを実行したいと考えています。 .

何か案は?

4

2 に答える 2

1

よくわかりませんが、Visual Studio SDK を使用してこれを行う方法があると思います。たとえば、[Web 参照の追加] ダイアログを表示するために参照できるオブジェクト モデルがあることを思い出します。もちろん、「Web 参照の更新」も実行できます。その後、これを行う MSBUILD タスクを作成できるはずです。

また、そのようなタスクが既に存在する可能性があることも考慮する必要があります。MSBUILD タスクの公開コレクションについては、Codeplex などの場所を確認してください。

于 2009-02-19T20:02:32.723 に答える
1

PowerShell スクリプトを使用して、wsdl.exe ツール (またはこの場合は svcutil.exe) を実行します。スクリプトはサービスに対して実行され、新しい wsdl を取得してプロキシを再生成します。PSにアクセスするために使用できます。唯一のトリックは名前空間を正しく取得することですが、wsdl.exe にはそのためのオプションがあります。

<Target Name="UpdateWebReferences">

<Exec WorkingDirectory="$(SolutionRoot)" 
      Command="$(PS) -Noninteractive -Command $(SolutionRoot)\tools\PowerShell\Compile-Wsdl.ps1 -ukf $(ConfigFilePath)" 
      Condition=" Exists('$(ConfigFilePath)') And Exists('$(SolutionRoot)\tools\PowerShell\Compile-Wsdl.ps1') " />

上記はチームビルドに当てはまります。powershell 関数の内容は次のとおりです。

$projectFile = [xml]( Get-Content $projectFilePath ) 

if ( $projectFile -and $WSDL_LANGUAGE -ne "VB")
{
    $ns = $projectFile.Project.PropertyGroup[ 0 ].RootNamespace
}
else
{
    $ns = $NAMESPACE_PREFIX
}

foreach( $webRefDir in Get-ChildItem $dir.FullName )
{
    $webRefName = $webRefDir.Name

    if ( [System.String]::IsNullOrEmpty( $ns ) )
    {
        $namespace = $webRefName
    }
    else
    {
        $namespace = $( "{0}.{1}" -f $ns, $webRefName )
    }

    Write-Host $( "Compiling Web Reference: {0} using Namespace: {1}..." -f $webRefName, $namespace )

    $outputPath = $( "{0}\{1}" -f $webRefDir.FullName,$REFERENCE_FILE )

    $xpath = "/configuration/appSettings/add[@key='{0}']" -f $webRefName

    if ( $URL_KEY_FILE )
    {
        $xml = [xml](Get-Content $URL_KEY_FILE)
        $url = $xml.SelectSingleNode( $xpath )

        if ( $url )
        {
            $urlOrPath = $url.Value
        }
        else
        {
            Write-Warning $( "Could not find key {0} in {1}..." -f $webRefName, $URL_KEY_FILE )
        }
    }
    else
    {
        $urlOrPath = $( Get-ChildItem $webRefDir.FullName -r -filter "*.wsdl" ).FullName
    }   

    if ( $urlOrPath )
    {
        wsdl /nologo /language:$WSDL_LANGUAGE /n:$namespace /o:$outputPath /urlkey:$webRefName $urlOrPath
    }

    Write-Host "....................................................."
}

これに必要なのは、「Web References」フォルダをチェックインしておくことだけです。各ディレクトリをループして、正しい名前空間を作成します。スクリプトは長いですが、喜んでメールでお送りします。

于 2009-04-01T15:57:06.493 に答える