1

エンド ユーザーがスタートアップ タスクとしてインストールするために使用するアドオン用の Nuget パッケージをビルドしたいと思います。その後、アプリケーションを Windows azure プラットフォームにアップロードします。

1 つの単純な Web アプリケーションと 1 つのクラウド プロジェクトを取り、Nuget エンド ユーザーを使用してアドオン パッケージを追加すると、Web アプリケーション プロジェクトに 2 つのファイル (exe と構成) が追加され、次のようにクラウド プロジェクトの ServiceDefinition.csdef にスタートアップ タスクが追加されます。形

ここに画像の説明を入力

このタイプの Nuget パッケージを作成するにはどうすればよいですか?

前もって感謝します。

アップデート:

NICK の回答に従って試してみましたが、下の図に示すように、クラウド プロジェクトで 2 つの webrole に問題が発生しています。 2 つの webrole を持つクラウド プロジェクト 以下のようにエラーが発生しています

powershell スクリプトでスタートアップ タスクを追加する際のエラー

また、コマンド ラインを使用してその Nuget パッケージをインストールする場合、すべての webrole プロジェクトを考慮して、ソリューションに exe ファイルと構成ファイルを追加するにはどうすればよいかという質問が 1 つあります。

4

1 に答える 1

3

Nugetパッケージは、規則に基づいて機能します:http: //docs.nuget.org/docs/creating-packages/creating-and-publishing-a-package#From_a_convention_based_working_directory

exeとconfigに関しては、次のことができます。

  1. パッケージディレクトリに次のディレクトリを作成します
    • mkdir lib(exe用)
    • mkdirコンテンツ(構成用)

exeに対して行う必要があるのは、ファイルをlibディレクトリにドロップし、メタデータノードのすぐ下にある.nuspecファイルを変更することだけです。「ファイル」ノードがあるはずです(そうでない場合は追加できます)。ファイルノード内に次のようなものを追加します。

<file src="content\my.exe" target="content\my.exe" />

設定は少し異なります。myname.config.transformという名前のファイルをコンテンツディレクトリに追加し、.nuspecファイルにエントリを追加するだけです。

注意すべき点がいくつかあります。

  1. 設定ファイルがアプリに存在しない場合は、設定ファイルが追加されます。
  2. すでに存在するファイルがある場合にのみ、変換するノードを追加する必要があります
  3. 変換ファイルはノード上で完全に一致するため、次のファイルが

設定ファイル:

<add key="test" value="myval"/>

そしてあなたの変身ではあなたは持っていました:

<add key="test" value="myval2"/>

結果のファイルは次のようになります。

<add key="test" value="myval"/>
<add key="test" value="myval2"/>

スタートアップタスクを追加する限り、それは私にとってもう少しトリッキーでした(はるかに良い方法があるかもしれません)。install.ps1でPowerShellを使用します(上記のファイルと同じですが、「tools」ディレクトリを作成します)。

param($installPath, $toolsPath, $package, $project)

#Modify the service config - adding a new Startup task
$svcConfigFile = $DTE.Solution.Projects|Select-Object -Expand ProjectItems|Where-Object{$_.Name -eq 'ServiceDefinition.csdef'}
$ServiceDefinitionConfig = $svcConfigFile.Properties.Item("FullPath").Value
[xml] $xml = gc $ServiceDefinitionConfig

#Create startup and task nodes

# So that you dont get the blank ns in your node
$startupNode = $xml.CreateElement('Startup','http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition')
$taskNode = $xml.CreateElement('Task','http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition')
$taskNode.SetAttribute('commandLine','my.exe')
$taskNode.SetAttribute('executionContext','elevated')
$taskNode.SetAttribute('taskType','simple')
$startupNode.AppendChild($taskNode)

#Check to see if the startup node exists
$modified = $xml.ServiceDefinition.WebRole.StartUp
if($modified -eq $null){
    $modified = $xml.ServiceDefinition.WebRole
    $modified.PrependChild($startupNode)
}
else{
    $nodeExists = $false
    foreach ($i in $xml.ServiceDefinition.WebRole.Startup.Task){
        if ($i.commandLine -eq 'my.exe'){
            $nodeExists = $true
        }
    }
    if($taskNode -eq $null -and !$nodeExists){
        $modified.AppendChild($taskNode)
    }
}
$xml.Save($ServiceDefinitionConfig);

これがお役に立てば幸いです。

-ニック

于 2012-05-14T14:42:53.867 に答える