- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
一个 recent question在这里,我开始思考了。
在我尝试过的大多数 Linux 发行版上,一些 Perl 模块可以通过包管理器获得。其他人,当然不是。在很长一段时间里,每当我需要安装一些 CPAN 模块时,我都会使用我的包管理器来确定一个包是否可用,并在它可用时安装它。
明显的优势是,只要有新版本的软件包可用,您就可以更新模块。
但是,当模块不以预打包形式提供并且该模块存在依赖项时,您就会遇到麻烦。每次 cpan shell 询问它是否应该遵循依赖项时都启动你的包管理器可能会很累。
通常,另一个缺点是预打包模块的版本。如果您正在运行 Debian 或 Ubuntu,您很快就会发现您将无法生活在最前沿,就像许多 CPAN 模块作者似乎所做的那样。
Linux 上的其他 Perl 人员如何处理这个问题?你只是忽略了你的包管理器必须提供的东西吗?是否有任何工具可以使 apt(例如)和 cpan 成为更好的队友?还是您根本不通过 cpan shell 安装任何东西?
最佳答案
为了开发,我安装了我自己的 Perl 并且不理会系统 Perl。如果我想升级系统 Perl,我使用系统包管理器。对于我的 Perl 开发,我使用 cpan 工具。
由于我将它们分开,我不应该弄乱系统维护任务等所需的 Perl,但我不必依赖系统的开发决策。
安装单独的 Perls 非常容易。当您从源代码分发版运行配置时,它会询问您要将所有内容安装在哪里。给它任何你喜欢的路径。例如,我在 /usr/local/perls 中安装了许多 Perls,并且每个安装的所有内容都单独存在。然后我在 /usr/local/bin 中为它们创建符号链接(symbolic link)(例如 perl5.8.9、perl.5.10.0、perl5.10.0-threaded)。当我想要一个特定版本时,我只使用我想要的那个:
$ perl5.10.0 program.pl
特定的二进制文件可确保程序选择正确的模块搜索路径等(与该二进制文件的 Config.pm 模块中的内容相同)。
这是我用来创建符号链接(symbolic link)的脚本。它在 bin 目录中查找,找出 Perl 版本,并创建 cpan5.10.1
等链接。每个程序都已经知道要调用的正确 perl:
#!perl
use 5.010;
use strict;
use warnings;
use File::Basename;
use File::Spec::Functions;
my $perls_directory = catfile(
$ARGV[0] // '/usr/local/perls',
'perl*'
);
die "$perls_directory does not exist!\n"
unless -d dirname $perls_directory;
my $links_directory = $ARGV[1] // catfile( $ENV{HOME}, 'bin' ); #/
die "$links_directory does not exist!\n" unless -d $links_directory;
foreach my $directory ( glob( $perls_directory ) )
{
say "Processing $directory...";
unless( -e catfile( $directory, 'bin' ) )
{
say "\tNo bin/ directory. Skipping!";
next;
}
my @perls = glob( catfile( $directory, qw( bin perl5* ) ) );
my( $perl_version ) = $perls[0] =~ m/(5\.\d+\.\d+)\z/;
say "\tperl version is $perl_version";
foreach my $bin ( glob( catfile( $directory, 'bin', '*' ) ) )
{
say "\tFound $bin";
my $basename = basename( $bin );
my $link_basename = do {
if( $basename =~ m/5\.\d+\.\d+\z/) { $basename }
else { "$basename$perl_version" }
};
my $link = catfile( $links_directory, $link_basename );
next if -e $link;
say "\t\tlinking $bin => $link";
symlink $bin => $link or
warn "\t\tCould not create symlink [$!]: $bin => $link!";
}
}
所有东西都安装在特定 Perl 的正确位置。
我也一直在考虑应该将那些 Perl 目录置于某种源代码控制之下。如果我添加了一个我不喜欢的模块,我会退回到较早的版本。不过我才刚刚开始这样做,还没有玩太多。
我在 Effective Perler 博客中写了更多关于这类事情的文章:
关于linux - 使用包管理器时如何管理 Perl 模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/398221/
我最近在我的机器上安装了 cx_Oracle 模块,以便连接到远程 Oracle 数据库服务器。 (我身边没有 Oracle 客户端)。 Python:版本 2.7 x86 Oracle:版本 11.
我想从 python timeit 模块检查打印以下内容需要多少时间,如何打印, import timeit x = [x for x in range(10000)] timeit.timeit("
我盯着 vs 代码编辑器上的 java 脚本编码,当我尝试将外部模块包含到我的项目中时,代码编辑器提出了这样的建议 -->(文件是 CommonJS 模块;它可能会转换为 ES6 模块。 )..有什么
我有一个 Node 应用程序,我想在标准 ES6 模块格式中使用(即 "type": "module" in the package.json ,并始终使用 import 和 export)而不转译为
我正在学习将 BlueprintJS 合并到我的 React 网络应用程序中,并且在加载某些 CSS 模块时遇到了很多麻烦。 我已经安装了 npm install @blueprintjs/core和
我需要重构一堆具有这样的调用的文件 define(['module1','module2','module3' etc...], function(a, b, c etc...) { //bun
我是 Angular 的新手,正在学习各种教程(Codecademy、thinkster.io 等),并且已经看到了声明应用程序容器的两种方法。首先: var app = angular.module
我正在尝试将 OUnit 与 OCaml 一起使用。 单元代码源码(unit.ml)如下: open OUnit let empty_list = [] let list_a = [1;2;3] le
我在 Angular 1.x 应用程序中使用 webpack 和 ES6 模块。在我设置的 webpack.config 中: resolve: { alias: { 'angular':
internal/modules/cjs/loader.js:750 return process.dlopen(module, path.toNamespacedPath(filename));
在本教程中,您将借助示例了解 JavaScript 中的模块。 随着我们的程序变得越来越大,它可能包含许多行代码。您可以使用模块根据功能将代码分隔在单独的文件中,而不是将所有内容都放在一个文件
我想知道是否可以将此代码更改为仅调用 MyModule.RED 而不是 MyModule.COLORS.RED。我尝试将 mod 设置为变量来存储颜色,但似乎不起作用。难道是我方法不对? (funct
我有以下代码。它是一个 JavaScript 模块。 (function() { // Object var Cahootsy; Cahootsy = { hello:
关闭。这个问题是 opinion-based 。它目前不接受答案。 想要改进这个问题?更新问题,以便 editing this post 可以用事实和引文来回答它。 关闭 2 年前。 Improve
从用户的角度来看,一个模块能够通过 require 加载并返回一个 table,模块导出的接口都被定义在此 table 中(此 table 被作为一个 namespace)。所有的标准库都是模块。标
Ruby的模块非常类似类,除了: 模块不可以有实体 模块不可以有子类 模块由module...end定义. 实际上...模块的'模块类'是'类的类'这个类的父类.搞懂了吗?不懂?让我们继续看
我有一个脚本,它从 CLI 获取 3 个输入变量并将其分别插入到 3 个变量: GetOptions("old_path=s" => \$old_path, "var=s" =
我有一个简单的 python 包,其目录结构如下: wibble | |-----foo | |----ping.py | |-----bar | |----pong.py 简单的
这种语法会非常有用——这不起作用有什么原因吗?谢谢! module Foo = { let bar: string = "bar" }; let bar = Foo.bar; /* works *
我想运行一个命令: - name: install pip shell: "python {"changed": true, "cmd": "python <(curl https://boot
我是一名优秀的程序员,十分优秀!