- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个相当大的构建自动化工具,它由 90% 的 PowerShell 代码组成。
许多功能都分组在 .psm1 文件中,这些文件通过使用相互加载
导入模块“$PSScriptRoot/AnotherModule.psm1”-Force
这似乎是开发目的/测试代码等的好主意,但我最近偶然发现这种方法存在问题。
每当加载的模块强制导入之前已加载到父/外部作用域中的另一个模块时,它不再可在此父/外部作用域中访问
现在我遇到了一个问题,在脚本开头导入所需的模块并不能保证导入的模块在脚本执行期间实际可用,因为其中一个导入的模块可能会“隐藏”另一个先前加载的模块:-/
假设我们有三个模块:ModA、ModB、ModC:
模组:
$ErrorActionPreference = "Stop"
Import-Module "$PSScriptRoot\ModB.psm1" -Force
// module A entrails
调制解调器:
$ErrorActionPreference = "Stop"
// module B entrails
国防部:
$ErrorActionPreference = "Stop"
Import-Module "$PSScriptRoot\ModA.psm1" -Force
// module C entrails
以下纠缠测试证明了这种“模块隐藏”行为:
Describe 'powershell module system tests' {
# ModA -> Import ModB -Force
# ModC -> Import ModA -Force
$mod_path = Join-Path $PSScriptRoot "testmod"
$mods = @("ModA", "ModB", "ModC")
It "cleanup leftovers from previous tests" {
Remove-Module $mods -ErrorAction SilentlyContinue
}
It 'is able to import ModA, which internally loads module B' {
Import-Module "$mod_path\ModA.psm1" -Force
Get-Module ModA | Should -Not -BeNullOrEmpty
Get-Module ModB | Should -BeNullOrEmpty
}
It 'is able to import a second module already imported by the first one' {
Get-Module ModA | Should -Not -BeNullOrEmpty
Import-Module "$mod_path\ModB.psm1" -Force
Get-Module ModB | Should -Not -BeNullOrEmpty
}
It 'still knows the first module' {
Get-Module ModA | Should -Not -BeNullOrEmpty
}
It 'is able to import a thid module that also imports the first one' {
Get-Module ModC | Should -BeNullOrEmpty
Import-Module "$mod_path\ModC.psm1" -Force
Get-Module ModC | Should -Not -BeNullOrEmpty
}
It 'does not know A or B any longer, as it has been hidden by C' {
Get-Module ModA | Should -BeNullOrEmpty
Get-Module ModB | Should -BeNullOrEmpty
}
It 'still knows C' {
Get-Module ModC | Should -Not -BeNullOrEmpty
}
It 'cleanup leftovers from this test' {
Remove-Module $mods
}
}
为了查明问题,我试图提出另一个测试代码库,并验证在导入另一个模块时没有从全局模块表中删除“已加载”模块:
Describe 'verify tool module system hierachy' {
$tool_modules = Get-ChildItem $script:engine_path -Filter "*.psm1"
function UNLoadAllToolModules {
Remove-Module 'Tool-*'
}
function LoadAllToolModules {
$tool_modules | Foreach-Object { Import-Module $_.FullName }
}
It "cleanup leftovers from previous tests" {
UNLoadAllToolModules
}
It "loading of a module does not hide an already loaded module" {
$errMods = $()
$tool_modules | ForEach-Object {
LoadAllToolModules
$pre = Get-Module
$mod = $_
Import-Module $mod.FullName -Force
$post = Get-Module
$mods = Compare-Object $post $pre | Select-Object -Expand InputObject | Select-Object -Expand Name
$mods | Foreach-Object {
"import of '$mod' hides '$_'" | Write-Host
}
if ($mods) {
$errMods += $mod.Name
}
}
$errMods | Should -BeNullOrEmpty
}
}
有没有办法打印/调试全局模块表,如图所示here ,所以我可以弄清楚哪个模块被多次加载/模块树在导入后如何修改?
目前,解决这个“问题”的唯一方法(除此之外,在其他模块中强制导入模块可能是一个糟糕的设计选择)是放弃 -force
或使用 -global
每当在此构建自动化套件/工具中包含的模块上调用 Import-Module -Force
时。
最佳答案
我对此的回答很简单,但可能不适用于您的情况。
PowerShell 中的作用域相当简单。但是,当您开始尝试做这样的事情时,我只是建议您将所有内容加载到全局范围内并完成它。否则,你最终会经常追尾。
在最终用户机器上,使用全局范围是 Not Acceptable (无论如何对我来说)。在构建自动化系统上,使用全局范围可能是可以接受的,具体取决于您的情况,因为这就是它的全部用途。
如果您查看Import-Module
cmdlet 的帮助,您会在-Global
参数下看到:
> [!TIP] > You should avoid calling `Import-Module` from within a module.
> Instead, declare the target module as a nested module in the parent module's manifest.
> Declaring nested modules improves the discoverability of dependencies.
The Global parameter is equivalent to the Scope parameter with a value of Global.
(我修正了格式,所以它在这里工作)。
此建议/提示也可能对您有用。
关于powershell - 在 psm1 模块内的导入模块上使用 'hiding' 时绕过 PowerShell 模块 '-Force',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66005926/
当我这样做时... import numpy as np ...我可以使用它但是... import pprint as pp ...不能,因为我需要这样做... from pprint import
我第一次尝试将 OpenCV 用于 Python 3。要安装,我只需在终端中输入“pip3 install opencv-python”。当我这样做时,我在 Finder(我在 Mac 上)中看到,在
如果有一个库我将使用至少两种方法,那么以下之间在性能或内存使用方面是否有任何差异? from X import method1, method2 和 import X 最佳答案 有区别,因为在 imp
我正在从 lodash 导入一些函数,我的同事告诉我,单独导入每个函数比将它们作为一个组导入更好。 当前方法: import {fn1, fn2, fn3} from 'lodash'; 首选方法:
之间有什么关系: import WSDL 中的元素 -和- import元素和在 XML Schema ...尤其是 location 之间的关系前者和 schemaLocation 的属性后者的属性
我在从 'theano.configdefaults' 导入 'local_bitwidth' 时遇到问题。并显示以下消息: ImportError
我注意到 React 可以这样导入: import * as React from 'react'; ...或者像这样: import React from 'react'; 第一个导入 react
对于当前的项目,我必须使用矩阵中提供的信息并对其进行数学计算,以及使用 ITK/VTK 函数来显示医疗信息/渲染。基本上我必须以(我猜)50/50 的方式同时使用 matlab 例程和 VTK/ITK
当我看到 pysqlite 的示例时,SQLite 库有两个用例。 from sqlite3 import dbapi2 as sqlite3 和 import sqlite3 为什么有两种方式支持s
我使用 Anaconda Python 发行版:Python 2.7 x64 和 Windows 7 SP1 x64 Ultimate。 当我import matplotlib.pyplot时,我得到
目录 【容器】镜像导出/导入 导出 导入 带标签 不带标签,后期修改 【仓库】镜像导出/导入
我正在寻找一种导入模块的方法,以便我可以从子文件夹 project/v0 和根文件夹 project 运行脚本。/p> 我在 python 3.6 中的文件结构(这就是没有初始化文件的原因) proj
我通常被告知以下是不好的做法。 from module import * 主要原因(或者有人告诉我)是,您可能会导入一些您不想要的东西,并且它可能会隐藏另一个模块中具有类似名称的函数或类。 但是,Py
我为 urllib (python3) 编写了一个小包装器。在if中导入模块是否正确且安全? if self.response_encoding == 'gzip': import gzip
我正在 pimcore 中创建一个新站点。有没有办法导出/导入 pimcore 站点的完整数据,以便我可以导出 xml/csv 格式的 pimcore 数据进行必要的更改,然后将其导入回来? 最佳答案
在 Node JS 中测试以下模块布局,看起来本地导出的定义总是在名称冲突的情况下替换外部导出的定义(参见 B.js 中的 f1)。 A.js export const f1 = 'A' B.js e
我在使用 VBA 代码时遇到了一些问题,该代码应该将 excel 数据导入我的 Access 数据库。当我运行代码时,我收到一个运行时错误“运行时错误 438 对象不支持此属性或方法”。来自我在其他论
我有一个名为 elements 的包,其中包含按钮、trifader、海报等内容。在 Button 类中,我正在执行 from elements import * 这执行正常,当我尝试 print(p
在我长期使用 python 的经验中,我遇到了一个非常奇怪的问题。 提前我想说我想知道为什么会发生这种情况 ,而不是如何更改我的代码或如何修复它,因为我也可以做到。 我正在使用 python2.7.3
我正在更新我的包。但是,我正在为依赖项/导入而苦苦挣扎。我使用了两个冲突的包 - ggplot2和 psych及其功能 alpha当然还有 alpha ggplot2 的对象不同于 alpha psy
我是一名优秀的程序员,十分优秀!