【问题标题】:Insert Import into project file at position 0 and save without prompt using Nuget install.ps1将 Import 插入项目文件的位置 0 并使用 Nuget install.ps1 在不提示的情况下保存
【发布时间】:2019-12-25 15:50:48
【问题描述】:

我正在构建一个 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 中弹出。这是为了避免用户的任何意外错误。为了克服这个问题,我在下面找到了一个链接,其中包含以下代码行,可以帮助我克服这个问题。

How can I reload a visual studio project thru a nuget powershell script

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

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

请帮忙。

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

【问题讨论】:

  • 嗨佩里,抱歉耽搁了。我可以看到在nuget.org/packages/WiX.Toolset.UnofficialFork/# 发布的内容。当我查看这个包的 install.ps1 时,我可以看到一些类似于我正在寻找的代码。
  • 我认为您已经从 nuget 的 install.ps1 powershell 脚本中得到了答案。如果您有任何其他问题,请随时告诉我们,我们很乐意为您提供帮助。
  • 当然佩里。非常感谢您的及时帮助。

标签: nuget installation visual-studio-2019 projects-and-solutions


【解决方案1】:

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

由于你想让Custom.Targets成为xxx.proj文件中的第一个导入项目,你可以把它从Powershell中分离出来,然后使用Custom Build Targets or Props来实现。其实我和powershell脚本不太一样,所以我推荐这个从NuGet 2.5开始发布的easy函数。

注意这个函数应该使用nuget.exenuspec file来打包你的项目。

第 1 步)

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

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

注意:从文档中看到:

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

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

因此,您应该将您的 Custom.Targets 更改为 &lt;package_id&gt;.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 打包您的项目。

另外,请确保您使用的属性,项目或目标在您的自定义道具中定义,以防您使用Microsoft.Common.props或@中定义的一些常见属性987654340@,找不到并报错,因为这些文件是在你自定义的props之后导入的。

这是我测试过的结果:

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

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

希望对你有帮助。

【讨论】:

  • 嗨佩里,非常感谢您的详细回复。但是,我可能忘了提到我的是 Visual Studio 中的一个 WiX 项目。因此,.net standard 2.0 之类的文件夹不相关。此外,它根本不是一个 SDK 项目。因此,我不确定是否可以使用 .props 方法。此外,我通常使用 Nuget 包资源管理器来构建我的 Nuget 包。考虑到所有这些,您概述的步骤对我有用吗?无论如何,再次感谢您的详细解释。
  • .net standard 2.0之类的文件夹不是必须的格式,你可以把props放到build文件夹中。 props 文件和targets 文件一样,可以包含很多target、properties 等。 ·Nuget Package Explorer`类似于nuget.exe cli,也可以打包wix项目。您只需关注guidance 即可获得您想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2012-12-11
  • 1970-01-01
  • 2021-10-04
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多