在NuGet的Init.ps1中创建或获取解决方案文件夹

4

我试图创建一个 Init.ps1 脚本,用于为 NuGet 包创建项目文件夹,并将文件添加到该文件夹中。但是这个文件夹可能已经存在于项目中。

如果这个文件夹不存在,脚本可以成功地添加或替换文件到文件系统中,并且文件可以成功地添加到新创建的解决方案文件夹中。然而,如果该解决方案文件夹已经存在,则会创建一个名为 NewFolder1(或2、3等)的新解决方案文件夹,但不会向现有解决方案中添加任何文件。

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链接:

1个回答

7
当您向解决方案中添加解决方案文件夹时,它将从EnvDTE80.Solution2的Projects属性中提取。因此,使用$solutionNode.Projects似乎可行。代码中唯一的修改是使用$solutionNode.Projects而不是$solution.Projects,因为$solution不存在于任何地方,所以结果总是$null。
$solutionItemsNode = $solutionNode.Projects | where-object { $_.ProjectName -eq "FolderName" } | select -first 1

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

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

感谢您发现了这个笔误,但是它现在的行为与原始代码相同——如果解决方案文件夹已经存在,则创建NewFolder1并不会将文件添加到解决方案中。已相应更新问题。 - Danny Varod
我直接在程序包管理器控制台中测试了代码,而不创建NuGet软件包,它对我起作用了。另外,在你的问题中,你仍然在代码中使用$solution - Matt Ward
错过了那个时间点 - 编译器的缺失和我工作到深夜不相容。现在再次进行测试。 - Danny Varod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接