【问题标题】:Create or Get Solution folder in NuGet Init.ps1在 NuGet Init.ps1 中创建或获取解决方案文件夹
【发布时间】:2015-02-13 00:33:57
【问题描述】:

我正在尝试为 NuGet 包创建一个 Init.ps1 脚本,该脚本将项目添加到解决方案文件夹中,该文件夹可能已经存在也可能不存在于解决方案中。

脚本成功添加或替换文件系统中的文件,如果没有这样的解决方案文件夹,则将项目成功添加到新创建的解决方案文件夹中,但是,如果解决方案文件夹已经存在,则名为 NewFolder1 的新解决方案文件夹(或 2 及以上,如果已经存在)被创建,并且没有文件被添加到解决方案中。

param($installPath, $toolsPath, $package)

$solutionNode = Get-Interface $dte.Solution ([EnvDTE80.Solution2])

$solutionItemsNode = $solutionNode.FindProjectItem("FolderName")

$solutionItemsProjectItems = Get-Interface $solutionNode.ProjectItems ([EnvDTE.ProjectItems])

if (!$solutionItemsProjectItems) {

    $solutionItemsNode = $solutionNode.AddSolutionFolder("FolderName")

    $solutionItemsProjectItems = Get-Interface $solutionItemsNode.ProjectItems ([EnvDTE.ProjectItems])

}

$rootDir = (Get-Item $installPath).parent.parent.fullname

$deploySource = join-path $installPath '\sln\'
$deployTarget = join-path $rootDir '\FolderName\'

New-Item -ItemType Directory -Force -Path $deployTarget

ls $deploySource | foreach-object {

    $targetFile = join-path $deployTarget $_.Name

    Copy-Item $_.FullName $targetFile -Recurse -Force

    $solutionItemsProjectItems.AddFromFile($targetFile) > $null

} > $null

我尝试了各种更改,例如检查$solutionItemsNode 而不是$solutionItemsProjectItems(效果相同),直接添加到解决方案而不是解决方案文件夹下(什么也没做)以及以下更改与原始更改相同:

$solutionItemsNode = $solution.Projects | where-object { $_.ProjectName -eq "FolderName" } | select -first 1

if (!$solutionItemsNode) {
    $solutionItemsNode = $solutionNode.AddSolutionFolder("FolderName")
}


有什么指点吗?


相关问答和 MSDN 链接:

【问题讨论】:

    标签: visual-studio powershell nuget envdte


    【解决方案1】:

    当您将解决方案文件夹添加到解决方案时,它可以从 EnvDTE80.Solution2 的 Projects 属性中获得。

    所以使用 $solutionNode.Projects 似乎可行。您对代码的唯一修改是使用 $solutionNode.Projects 而不是 $solution.Projects 因为 $solution 在任何地方都不存在,所以结果总是 $空。

    $solutionItemsNode = $solutionNode.Projects | where-object { $_.ProjectName -eq "FolderName" } | select -first 1
    
    if (!$solutionItemsNode) {
        $solutionItemsNode = $solutionNode.AddSolutionFolder("FolderName")
    }
    

    如果解决方案文件夹已经存在,上面的代码将不会添加它。

    【讨论】:

    • 感谢您找到错字,但是,它知道与原始代码的行为相同 - 如果解决方案文件夹已经存在,则会创建 NewFolder1 并且不会将文件添加到解决方案中。相应地更新了问题。
    • 我直接在包管理器控制台中测试了代码,没有创建 NuGet 包,它对我有用。此外,您仍在问题代码中使用$solution。
    • 错过了那个地方 - 缺乏编译器 + 我在这方面工作的时间很晚,这并没有一起发生。现在再次测试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2013-11-25
    相关资源
    最近更新 更多