2011-12-12 20 views
22

私はNuGetパッケージを作成しており、そのためにNuspecマニフェストファイルを作成しました。 contentフォルダには、私は2つのファイル、test.exetest.configがあります。これらのファイルのプロパティ "Copy To Output Directory"をプロジェクト内の "Copy Always"に変更したいと思います。NuGet:Install.ps1ファイルでファイルのプロパティを変更する方法はありますか?

関連する質問NuGet how to apply properties to filesが見つかりました。これはPowerShell install.ps1スクリプトを使用してこれを行うことができますが、そのファイルの作成方法はわかりません。

答えて

37

install.ps1ファイルは次のようになります。ここで

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

$file1 = $project.ProjectItems.Item("test.exe") 
$file2 = $project.ProjectItems.Item("test.config") 

# set 'Copy To Output Directory' to 'Copy if newer' 
$copyToOutput1 = $file1.Properties.Item("CopyToOutputDirectory") 
$copyToOutput1.Value = 2 

$copyToOutput2 = $file2.Properties.Item("CopyToOutputDirectory") 
$copyToOutput2.Value = 2 
+1

//私はPowerShellのコメントではありません。#:)それ以外の場合は非常に便利です、ありがとう – grahamrhay

+1

@brent:Item( "CopyToOutputDirectory")の受け入れられた値に関するドキュメントを探しています。これはDTE列挙型ですが、それを見つけてください: - あなたのリファレンスへのリンクは、私とこの答えを見つけた人に大きな助けになります。 – workabyte

15

終了するには、この問題の最後を解決する方法についてもう少し詳細です:あなたは、ステータスを確認するために2つのことを行う必要がある

インストール正しくに設定されている...

  1. install.ps1スクリプトを記述して、ファイルのステータスをマークします。
  2. install.ps1スクリプトが、nugetパッケージのToolsディレクトリにあることを確認します。

Install.ps1スクリプト

次のスクリプト例では、再帰的に「新しいへコピー」として「コンテンツ」と「ビュー」ディレクトリ内のすべてのファイルをマークします。このサンプルスクリプトは、読んで理解するために書かれています。 Visual StudioプロジェクトのルートディレクトリにあるContentフォルダとViewsフォルダ内のすべてのファイルをマークします。

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

function MarkDirectoryAsCopyToOutputRecursive($item) 
{ 
    $item.ProjectItems | ForEach-Object { MarkFileASCopyToOutputDirectory($_) } 
} 

function MarkFileASCopyToOutputDirectory($item) 
{ 
    Try 
    { 
     Write-Host Try set $item.Name 
     $item.Properties.Item("CopyToOutputDirectory").Value = 2 
    } 
    Catch 
    { 
     Write-Host RecurseOn $item.Name 
     MarkDirectoryAsCopyToOutputRecursive($item) 
    } 
} 

#Now mark everything in the a directory as "Copy to newer" 
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Content")) 
MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Views")) 

ツール

コピー先あなたはnugetによって実行されるスクリプトのToolsディレクトリにinstall.ps1ファイルをコピーする必要があります。これを行うには、以下をnuspecテンプレートに追加することができます。

<files> 
    <file src="install.ps1" target="Tools"/> 
</files> 

この場合、私はVisual Studioプロジェクトのルートにinstall.ps1ファイルがあり、「新しい場合はコピーする」とマークされています。

+0

例外 "HRESULTからの例外:0x80070057(E_INVALIDARG))" Tools \ install.ps1:3 char: (0):CategoryInfo:NotSpecified:():$ project.ProjectItems.Item <<<<( "コンテンツ")。ProjectItems.Item( "file.jar")。プロパティ.Item( "CopyToOutputDirectory" )[]、MethodInvocationException + FullyQualifiedErrorId:ComMethodTargetInvocation ' は私が ' MarkDirectoryAsCopyToOutputRecursive($ project.ProjectItemsを変更することにより、これを修正しました。項目( "コンテンツ")) ' へ ' MarkDirectoryAsCopyToOutputRecursive($プロジェクト)) ' – Paul

+1

@Paulあなたの提案が**あなたが望むものはおそらくないCopyIfNewerにプロジェクト内EVERYTHING **を設定します。 '$ project.ProjectItems.Item(" ")'を使って、プロジェクトのそのフォルダにあるファイルのプロパティだけを設定することができます。これは答えから100%明らかではありません。 –

関連する問題