自动设置新工作站的一个小实用程序;链接配置文件和安装软件包。

wsconfig的Python项目详细描述


wsconfig
==


这是一个用于自动配置工作站的小实用程序:
安装包、链接点文件等。

设计目标(也称为"为什么不使用shell脚本?"):

-提供一个标记系统来选择要在特定的
系统上运行的命令。

-提供高级命令,因此同一个脚本可以在不同的操作
系统上运行,而重复性较低。

-简化某些事情,例如在Linux上需要符号链接:``ln``了解目标和源之间的相对路径。



$echo"hello world">;>/tmp/test

``mkdir``和``link``是用python实现的高级命令。``$``是
直接在shell中运行。有关所有命令,请参阅下面的详细信息。

要将命令限制到特定操作系统,请执行以下操作::

$defaults write nsglobaldomain appleshowscrollbars-string"always"
}




``wsconfig--默认值``。您可能看到的标记有``sys:windows`,
``sys:linux`,``sys:macos``,但也有``sys:ubuntu`,``sys:ubuntu:natty`
或``sys:windows:7`.

可以使用自定义标记::

dpkg python setuptools




上面的示例以大写字母开头,
``wsconfig``会将其视为"public",并将其作为在命令行上定义的选项提供给您。您可以在内部使用小写标记将
命令拆分为块::


devenvironment{
define php
define python
}

dpkg python setuptools
$easy\u install pip

dpkg php5 cli php5 xdebug
}

它们实际上是"if条件",并且保证命令按照它们在脚本文件中出现的顺序运行,即首先
运行"python"块中的命令,然后运行"php"块中的命令。

/>您不希望出现以下情况,因为"define"似乎会延迟
产生任何实际效果::

dpkg php5 cli
}
devenvironment{
define php
}




您可以嵌套条件::

python{
sys:linux{dpkg:python setuptools}
sys:osx{$brew install python setuptools}
}



>一个条件还可以指定多个标记。以下是与上述完全相同的
。您更喜欢的是样式:

python sys:osx{$brew install python setuptools}



如果将大写标记与系统标记组合在一起,则大写标记将
仅在运行时作为选择提供系统::

sys:linux virtualmachine{
$gconftool-2-s/apps/gnome屏幕保护程序/lock-enabled--type=bool false
}

ill
忽略它。

目前不支持使用括号
的表达式::

define tarsnap


nt``cygwin``作为一种选择。

如果您不想在
虚拟化环境中安装Thunderbird::

sys:linux!vm{
dpkg thunderbird
}


最后,您当然也可以使用注释:

实现它们的前一种方法是:使用标记选择器禁用语句块::

comment{
sys:linux(

}
}




variables
--


有时您希望在脚本中使用特定于机器的值;``wsconfig`
有一个变量系统允许您执行此操作。将要求您为有效脚本中使用的所有变量提供
值(也就是说,您不会为只在不运行的命令中使用的变量而烦恼)在``apply``运行的开始处。


语法使用双-@符号::

$sudo scutil--set computername"@"hostname@"

variaBLE是区分大小写的。



root用法
----


`` wsconfig``使用``sudo`
以根用户身份运行命令。

``mkdir``,要以根用户身份运行它们,可以在它们前面加上"su do"一词:



e命令在shell中执行某些操作。它们不像其他命令那样被解析-
,而是按原样将内容提供给shell。还支持多行shell语法
::

$:set-e
foo=bar
echo$foo

whitespace在这里很重要。在冒号之后,
缩进至少与冒号位置相同的字符的每一行将被视为shell命令的一部分。缩进
级别等于或低于列的第一行将是下一个常规命令::

$:
foo=bar
echo$foo
提醒"这不再是shell"

dpkg
使用apt get在debian系统上安装dpkg包。

brew
la via homebrew;首选本地命令
,因为如果已安装请求的公式
,后者将返回错误代码。

link
创建符号链接。这两个路径名都可以相对于配置文件本身,wsconfig将正确构造链接目标路径。


如果目标文件已经存在,并且其链接目标与您希望的目标不同,则该命令将失败。您可以添加一个`-f``选项
来强制覆盖链接::

link-f virtualenvs/postkvirtualenv~/.virtualenvs/postkvirtualenv

创建一个目录,如果它还不存在的话。

pip
使用"pip"安装一个python包。pip需要可用。

通过wine运行windows可执行文件。


提醒自己一些手动设置步骤。这些WI将被收集并在脚本结束时显示。


确保"行
向给定文件添加一行,但前提是该行尚未存在::


确保"行~/.bashrc"~/.bashrc"michael"





可供选择:
dev
vm
$wsconfig my_config_file apply development



tagging in depth
----


>以下是关于标记系统的一些扩展思想,以及我对它的思考(目前仍在进行中)。

总工程师。它正在进行预处理,以便以下操作按预期工作:

foo bar qux{remind"stop drinking"}
bar{define qux}
foo{define bar}
define foo

我们将遍历文档,直到没有新的"defines"被激活,然后使用所有发现的标记作为起始集。然而,这个孩子似乎患有精神分裂症。倾向于这样使用:


foo




define chrome


}

,即作为一种"调用"或"包含",使用"chrome"选择器在视觉/结构上封装相关命令。虽然上面的
确实有效,但即使现在,如果"chrome"块在后面,那么这个被认为是include的整个
点是,它在文件中的位置应该无关紧要。
但实际上"define"不是这样的。如果上面的``foo``命令失败,
并且此时脚本被中止,您将希望不会处理``chrome``块。但是,如果"defines"按原样进行了预处理,那么这样的块可能已经运行了。

开发{
定义基本开发
定义python
定义php
}



ike``base linux``,
这很难看,但充其量也造成了问题,这里不再是一个
清晰的执行顺序,只是稍微更容易接受(如果上面看起来很清楚,
考虑一个大文件,其中包含顺序命令,并与这些
包混合在一起。

n inclusion
概念,这就是以这种方式对它们进行预处理的功能。这是一种精神分裂症,因为它混淆了标记选择器是否是所谓的"if条件",或者它们是否应该被视为"包"。

相反,如果需要的话,可以单独引入包的概念::

@chrome(



sys:linux{

@chrome包括chrome包。
}

@()-语法可以指示包,而不是选择器,它们只有在包含时才会运行(但只运行一次)。这些语句还有其他用途,例如
表示"执行单元",在这里会捕获错误,这样包中的
错误会导致跳过包中的后续语句,
但运行外部的其他语句。

另一方面,引入不同类型的语法可能已经太多了。毕竟这应该很简单。还有另一个潜在的解决方案:多通道应用过程。因此,如果我们以前面的例子为例::

sys.linux{

foo


如果脚本以"foo"结尾,
,则不会运行"chrome"块。相反,处理文档
的代码只有在``foo``已经运行时才会遇到``define``并且当它
运行时,它会安排另一个文档遍历。第二次,已经跳过了
的命令,但是现在运行由标记新解锁的命令。


-它避免了最初的"define"的主要概念问题-
它是按顺序处理的。
-需要实现@语法以避免运行多次
时间。
-它修复了现在定义的问题,如果顺序不对,它们不会有任何影响。

——————————————————————————————————————————————————————————————————————————取下面的
段代码::

devenviron{
python{}
php{}
}

::

define python
}
python{
python3{}


`` wsconfig ``要么必须不加区分地将所有这样的标记作为选项,作为一个简单的列表,而不识别依赖项,即使在第一个示例中,定义``python``没有同时定义``devenviron``也没有任何效果(这可能是一个可选的``--all``开关)。
要么它必须向您呈现一个tree选项,即识别"dev"和"python"之间的依赖关系。这可以通过一个智能的
算法实现,也可以通过一个多步骤的选择过程(选择
``devenviron`,然后选择`python`,在每个步骤遍历树之后,找到可用的
新标记)。


确实有很多道理,其中一个原因是如何轻松地解决这个问题。如果验证失败::

dev{}
}


,那么下面的代码将绕过它,但具有相同的效果(没有dev标记的python

python{noop}
}
python{define python}









类似的工具
---——

https://github.com/technicalpickles/homesick

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
通过Javascript(JSON)使用Java的性能、可扩展性和安全性   调试java。朗,数学。日志被内在调用取代,为什么不是java。朗,数学。exp()?   Hibernate中的java动态表名   java找不到可接受的表示406不可接受错误   无阵列的java刽子手游戏   继承Java错误地创建了子类和超类   java如何将可更改为可编辑且不在不同的选择中?   JavaSQLite在emulator上完美地显示检索到的数据,但在实际设备/应用程序中不检索任何内容   java硬件的静态成员。具有运行现金储备的抽象类,现金始终返回到初始化的数字   java对变量的静态和非静态访问的混淆