5

Tengo una gran cantidad de código de powershell que he escrito en el transcurso de un proyecto largo; estos scripts realizan una amplia variedad de funciones, y la mayoría de ellos dependen de alguna manera de otros dentro del alcance del proyecto. En este momento, el trabajo se compone de un par de archivos que contienen muchas funciones cada uno. Originalmente, para poder trabajar con estos scripts, todos los archivos de script estaban distribuidos de forma aleatoria en el entorno.¿Cómo administrar las dependencias entre scripts en el módulo Powershell de varios archivos?

Sin embargo, he aprendido recientemente que Powershell 2.0 presenta módulos, y me gustaría implementar estos scripts juntos de esa manera. Dado que los contenidos de un módulo se cargan todos juntos, me gustaría separar mis archivos para que cada script tenga su propio archivo, para ayudar al control de la fuente. Sin embargo, ahora estoy un poco confuso acerca de las conexiones entre los guiones.

He hecho algunas pruebas y parece que está bien mover el comando Export-ModuleMember para cada función a los archivos individuales .ps1; esto parece más como funciones que declaran su propio alcance como el alcance público y privado en C#. Sin embargo, después de hacer eso, mi archivo .psm1 no contiene nada más que esto:

Get-ChildItem -recurse $psScriptRoot | where { $_.Extension -eq ".ps1" } | foreach { . $_.FullName } 

¿Eso parece correcto? Todos los scripts se obtienen con fuente de puntos, y todos los scripts se refieren entre sí bajo esa suposición. ¿Deberían referirse el uno al otro usando sus ubicaciones relativas a $ psScriptRoot?

¿Hay alguna manera diferente de estas dos formas? ¿Alguien puede ofrecer un consejo? No sé mucho sobre esto todavía.

Respuesta

6

He visto una técnica similar donde cada archivo .ps1 contiene una función y las funciones se obtienen en el archivo PSM1 utilizado en el módulo WPK y en los módulos PSRemoteRegistry.

Esta línea es el módulo PSRemoteRegistry:

Get-ChildItem -Path $PSScriptRoot\*.ps1 | Foreach-Object{ . $_.FullName } 

diría que me gusta la técnica por tener uno archivos de comandos gigantes de funciones.

+1

en cierto modo me hago esto, pero el grupo varios como funciones en una secuencia de comandos en lugar de cada uno en su propio archivo. – JasonMArcher

4

también podría ver crear un manifiesto (en realidad no sé si necesita un psm1 con un psd1).

Aquí fue mi uso de un manifiesto:

New-ModuleManifest ` 
    -Path Fiddler.psd1 ` 
    -Author "Niklas Goude" ` 
    -CompanyName "http://www.powershell.nu/" ` 
    -ModuleVersion 1.0 ` 
    -Description "Module from http://www.powershell.nu/2011/03/14/fiddler/</a> - psd1 created by Matt @ amonskeysden.tumblr.com" ` 
    -FormatsToProcess @() ` 
    -RequiredAssemblies @("Fiddler.dll") ` 
    -NestedModules @() ` 
    -Copyright "" ` 
    -ModuleToProcess "Fiddler.psm1" ` 
    -TypesToProcess @() ` 
    -FileList @("Fiddler.psm1","Fiddler.dll") 

creo que la respuesta a su pregunta sería la de incluir su lista de archivos en el parámetro listaDeArchivos allí.

escribí algunos de mis hallazgos (incluyendo enlaces a recursos MS) aquí:

http://amonkeysden.tumblr.com/post/5127684898/powershell-and-fiddler

+0

El problema es que esto todavía no exporta los comandos para que get-command -module Fiddler muestre los comandos que este módulo pone a disposición. – flickerfly

Cuestiones relacionadas