0

我正在构建一个 Nuget 包,它有一个带有 install.ps1 的工具文件夹。这个 Nuget 包依赖于 NugetPowerTools 包,它提供了一些 API 来处理项目及其属性。我在下面的 install.ps1 中粘贴了代码。

param($installPath, $toolsPath, $package, $project)
$buildProject = Get-MSBuildProject
$import = $buildProject.Xml.AddImport("Custom.Targets")
$buildProject.Save()

我有 2 个问题。

  1. AddImport 将目标附加到末尾(即,在其他 Import 行之后)。我需要将 Import 作为第一行(因为我在此目标文件中有一些功能需要在其他文件之前执行)。是否可以先插入 Import (即我的 Custom.Targets 导入应该是项目文件中 Import 的第一项)?我找不到插入方法。

  2. 通过此 install.ps1 修改项目文件后,Visual Studio 中会弹出 /prompt,其中包含 4 个选项,即 SaveAs、Discard、Overwrite 和 Ignore。我想在没有此提示的情况下保存并覆盖项目文件/从我的 install.ps1 中弹出。这是为了避免用户的任何意外错误。为了克服,我在下面找到了一个链接,其中包含以下代码行,可以帮助我克服这个问题。

如何通过 nuget powershell 脚本重新加载 Visual Studio 项目

$(get-item $project.FullName).lastwritetime=get-date

但是现在,我得到另一个弹出/提示选项,包括重新加载、重新加载全部、忽略、全部忽略。有没有办法在没有这个提示的情况下重新加载这个项目?

请帮忙。

注意:如果有人可以在没有 NugetPowerTools 的情况下提供正确的语法,我可以不使用 NugetPowerTools。

4

1 回答 1

1

是否可以先插入 Import (即我的 Custom.Targets 导入应该是项目文件中 Import 的第一项)?我找不到插入方法。

由于要让Custom.Targets成为文件中的第一个导入项目,因此xxx.proj可以将其与 Powershell 分开,然后使用自定义构建目标或道具来实现它。其实我和powershell脚本不太一样,所以我推荐这个从NuGet 2.5开始发布的easy函数。

请注意,此函数应使用nuget.exenuspec 文件来打包您的项目。

步骤1)

build在项目根目录下的新文件夹中创建一个名为的文件。然后将<package_id>.props文件放入其中。此外,您最好添加一个与框架相关的适当子文件夹。像这样:

\build
    \netstandard2.0
        \<package_id>.props

注意:从文档中看到这个:

.props 添加在项目文件的顶部;.targets 添加在底部。

.targets.props文件的性质相同,但是在这种nuget机制下,.props文件被放置在文件的顶部xxx.proj。此外,文件名应与 nuspec 文件中定义的 package_id 相同。

因此,您应该将您的更改Custom.Targets<package_id>.pros.

第2步)

然后在 .nuspec 文件中,一定要在节点中引用这些文件:

<?xml version="1.0"?>
<package >
    <metadata minClientVersion="2.5">
    <!-- ... -->
    </metadata>
    <files>
        <!-- Include everything in \build -->
        <file src="build\**" target="build" />

        <!-- Other files -->
        <!-- ... -->
    </files>
</package>

步骤 3)

最后,使用nuget.exe打包您的项目。

另外,请确保您使用的属性、项目或目标是在您的自定义props中定义的,以防您在使用Microsoft.Common.propsor中定义的一些常用属性时,Microsoft.CSharp.targets由于这些文件是在导入之后无法找到并报错你的自定义道具。

这是我测试过的结果:

在此处输入图像描述

但现在,我得到另一个弹出/提示选项,包括重新加载、重新加载全部、忽略、全部忽略。有没有办法在没有这个提示的情况下重新加载这个项目?

我认为这种行为是由 VS 本身而不是 powershell 控制的。VS 会检测这些文件的状态并弹出提示。所以这是由 VS SDK 控制的。或者我想你可以参考这个文档通过 VS SDK 接口覆盖 VS 的行为。

希望它可以帮助你。

于 2019-12-26T09:33:26.667 回答