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, но, похоже, не могу его найти :-/ ссылка на вашу ссылку была бы очень полезна для меня и любого, кто найдет этот ответ. - person workabyte; 01.10.2014

Вот немного подробнее о том, как решить эту проблему от начала до конца:

Вам нужно сделать две вещи, чтобы убедиться, что статус установлен правильно при установке...

  1. Напишите сценарий install.ps1, чтобы отметить статус файлов.
  2. Убедитесь, что сценарий install.ps1 находится в каталоге Tools в пакете 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 в каталог Tools, чтобы скрипт мог быть выполнен 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