NuGet: Как мога да променя свойството на файлове с файл Install.ps1?

Създавам NuGet пакет и за това създадох манифестен файл на Nuspec. В папка content имам два файла, test.exe и test.config. Сега бих искал да променя свойството „Копиране в изходна директория“ на тези файлове на „Копиране винаги“ в проекта, когато някой потребител инсталира този пакет.

Намерих свързан въпрос NuGet как да прилага свойства към файлове, това показва, че може да направи това с помощта на PowerShell install.ps1 скрипт, но нямам представа как да създам този файл.


person Arun Rana    schedule 12.12.2011    source източник


Отговори (2)


Вашият файл 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
person Brent    schedule 17.01.2012
comment
// не е коментар в powershell, използвайте # :) иначе много полезно, благодаря - person grahamrhay; 09.07.2012
comment
@brent: търся някои документи за приети стойности за Item(CopyToOutputDirectory) знам, че това е DTE enum, но изглежда не мога да го намеря :-/ връзката към вашата справка би била голяма помощ за мен и всеки, който намери този отговор. - person workabyte; 01.10.2014

Ето малко повече подробности за това как да разрешите този проблем от край до край:

Трябва да направите две неща, за да сте сигурни, че статусът е зададен правилно при инсталиране...

  1. Напишете скрипта install.ps1, за да маркирате състоянието на файловете.
  2. Уверете се, че скриптът install.ps1 е в директорията с инструменти в пакета nuget.

Скрипт Install.ps1

Следният примерен скрипт рекурсивно ще маркира всеки файл в директорията „Съдържание“ и „Преглед“ като „Копиране в по-нов“. Имайте предвид, че този примерен скрипт е написан, за да бъде ясен за четене и разбиране. Той ще маркира всеки файл в папките Content и Views в главната директория на проекта Visual Studios.

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"))

Копиране в Инструменти

Трябва да копирате файла install.ps1 в директорията с инструменти, за да може скриптът да бъде изпълнен от nuget. Можете да добавите следното към шаблона на nuspec, за да направите това.

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

Забележете, че в този случай имам файла install.ps1 в корена на моя проект Visual Studios и маркиран като „Копиране, ако е по-ново“.

person James Roland    schedule 24.07.2013
comment
Горното даваше Exception calling "Item" with "1" argument(s): "The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))" At Tools\install.ps1:3 char:27 + $project.ProjectItems.Item <<<< ("Content").ProjectItems.Item("file.jar").Properties.Item("CopyToOutputDirectory").Value = 1 + CategoryInfo: NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : ComMethodTargetInvocation Поправих това, като промених MarkDirectoryAsCopyToOutputRecursive($project.ProjectItems.Item("Content")) на MarkDirectoryAsCopyToOutputRecursive($project)) - person Paul; 23.01.2014
comment
@Paul твоето предложение задава ВСИЧКО във вашия проект на CopyIfNewer, което вероятно не е това, което искате. можете да използвате $project.ProjectItems.Item("<folderNameHere>"), за да зададете свойствата само за файлове в тази папка на вашия проект. Това не е 100% ясно от отговора. - person Sam Holder; 13.02.2014