使用zef安装后如何编辑模块中的源代码?
How to edit the source code in module after installed it using zef?
例如,我安装了Cro模块,当我运行我的简单代码:
my %headers = {Authorization => OAuth realm="", oauth_consumer_key="xxxxxxxxxxxxxxxx", oauth_nonce="29515362", oauth_signature="KojMlteEAHlYjMcLc6LFiOwRnJ8%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1525913154", oauth_token="xxxx-xxxxxxxxxxxxxxxxxx", oauth_version="1.0", User-Agent => Cro};
my $resp = await Cro::HTTP::Client.get: 'http://api.fanfou.com/statuses/home_timeline.json',
headers => [
user-agent => 'Cro',
content-type => 'application/json;charset=UTF-8',
|%headers
];
say $resp.header('content-type'); # Output: application/json; charset=utf-8;
my Str $text = await $resp.body-text();
它说'无法解析媒体类型application/json; charset=utf-8;
Died with the exception:
Could not parse media type 'application/json; charset=utf-8;'
in method parse at /Users/ohmycloud/.perl6/sources/5B710DB8DF7799BC8B40647E4F9945BCB8745B69 (Cro::MediaType) line 74
in method content-type at /Users/ohmycloud/.perl6/sources/427E29691A1F7367C23E3F4FE63E7BDB1C5D7F63 (Cro::HTTP::Message) line 74
in method body-text-encoding at /Users/ohmycloud/.perl6/sources/427E29691A1F7367C23E3F4FE63E7BDB1C5D7F63 (Cro::HTTP::Message) line 83
in block at /Users/ohmycloud/.perl6/sources/F870148C579AB45DEB39F02722B617776C3D6D5F (Cro::MessageWithBody) line 49
好像application/json; charset=utf8;
不是有效的content-type
,所以我加个测试:
use Cro::MediaType;
use Test;
sub parses($media-type, $desc, &checks) {
my $parsed;
lives-ok { $parsed = Cro::MediaType.parse($media-type) }, $desc;
checks($parsed) if $parsed;
}
parses 'application/json; charset=utf-8;', 'application/json media type with charset', {
is .type, 'application', 'Correct type';
is .subtype, 'json', 'Correct subtype';
is .subtype-name, 'json', 'Correct subtype name';
is .tree, '', 'No tree';
is .suffix, '', 'No suffix';
is .Str, 'application/json; charset=utf-8;', 'Stringifies correctly';
};
done-testing;
输出为:
not ok 1 - application/json media type with charset
# Failed test 'application/json media type with charset'
# at cro_media.pl6 line 6
# Could not parse media type 'application/json; charset=utf-8;'
1..1
# Looks like you failed 1 test of 1
源代码似乎位于 /Users/ohmycloud/.perl6/sources/5B710DB8DF7799BC8B40647E4F9945BCB8745B69
文件中,我在 TOP
标记后添加 ';'?
:
token TOP { <media-type> ';'? }
保存,再次运行我的代码,但错误是一样的。那么如何让改变生效呢?在 Perl 5 中,我只能编辑我的 .pm
模块,但在 Perl 6 中,我不知道该做什么。
在 this answer in zef's issues 中,他们声明 "installations are immutable"。
如果您从其源代码下载 Cro,对其进行修补并再次安装,以便您的应用程序选择新版本,这可能是一个更好的选择。
也有可能'application/json'不承认那个字符集声明,或者;后面不应该有space。但这里的主要问题是你不应该在安装后编辑模块。
正如 jjmerelo 提到的,安装是不可变的,一种解决方案是下载源代码(包括 META6.json 文件),编辑您想要的代码,然后:
zef install . --/test
对于简单的测试,对我来说没问题。
至于application/json; chartset=utf-8;
无法解析,我在MediaType.pm6
的token
token中加了一个;
,使包含 ;
成为可能(也许这是一个错误,我不知道):
token token { <[A..Za..z0..9;!#$%&'*+^_`{|}~-]>+ }
本地安装,现在解析正常。
例如,我安装了Cro模块,当我运行我的简单代码:
my %headers = {Authorization => OAuth realm="", oauth_consumer_key="xxxxxxxxxxxxxxxx", oauth_nonce="29515362", oauth_signature="KojMlteEAHlYjMcLc6LFiOwRnJ8%3D", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1525913154", oauth_token="xxxx-xxxxxxxxxxxxxxxxxx", oauth_version="1.0", User-Agent => Cro};
my $resp = await Cro::HTTP::Client.get: 'http://api.fanfou.com/statuses/home_timeline.json',
headers => [
user-agent => 'Cro',
content-type => 'application/json;charset=UTF-8',
|%headers
];
say $resp.header('content-type'); # Output: application/json; charset=utf-8;
my Str $text = await $resp.body-text();
它说'无法解析媒体类型application/json; charset=utf-8;
Died with the exception:
Could not parse media type 'application/json; charset=utf-8;'
in method parse at /Users/ohmycloud/.perl6/sources/5B710DB8DF7799BC8B40647E4F9945BCB8745B69 (Cro::MediaType) line 74
in method content-type at /Users/ohmycloud/.perl6/sources/427E29691A1F7367C23E3F4FE63E7BDB1C5D7F63 (Cro::HTTP::Message) line 74
in method body-text-encoding at /Users/ohmycloud/.perl6/sources/427E29691A1F7367C23E3F4FE63E7BDB1C5D7F63 (Cro::HTTP::Message) line 83
in block at /Users/ohmycloud/.perl6/sources/F870148C579AB45DEB39F02722B617776C3D6D5F (Cro::MessageWithBody) line 49
好像application/json; charset=utf8;
不是有效的content-type
,所以我加个测试:
use Cro::MediaType;
use Test;
sub parses($media-type, $desc, &checks) {
my $parsed;
lives-ok { $parsed = Cro::MediaType.parse($media-type) }, $desc;
checks($parsed) if $parsed;
}
parses 'application/json; charset=utf-8;', 'application/json media type with charset', {
is .type, 'application', 'Correct type';
is .subtype, 'json', 'Correct subtype';
is .subtype-name, 'json', 'Correct subtype name';
is .tree, '', 'No tree';
is .suffix, '', 'No suffix';
is .Str, 'application/json; charset=utf-8;', 'Stringifies correctly';
};
done-testing;
输出为:
not ok 1 - application/json media type with charset
# Failed test 'application/json media type with charset'
# at cro_media.pl6 line 6
# Could not parse media type 'application/json; charset=utf-8;'
1..1
# Looks like you failed 1 test of 1
源代码似乎位于 /Users/ohmycloud/.perl6/sources/5B710DB8DF7799BC8B40647E4F9945BCB8745B69
文件中,我在 TOP
标记后添加 ';'?
:
token TOP { <media-type> ';'? }
保存,再次运行我的代码,但错误是一样的。那么如何让改变生效呢?在 Perl 5 中,我只能编辑我的 .pm
模块,但在 Perl 6 中,我不知道该做什么。
在 this answer in zef's issues 中,他们声明 "installations are immutable"。 如果您从其源代码下载 Cro,对其进行修补并再次安装,以便您的应用程序选择新版本,这可能是一个更好的选择。
也有可能'application/json'不承认那个字符集声明,或者;后面不应该有space。但这里的主要问题是你不应该在安装后编辑模块。
正如 jjmerelo 提到的,安装是不可变的,一种解决方案是下载源代码(包括 META6.json 文件),编辑您想要的代码,然后:
zef install . --/test
对于简单的测试,对我来说没问题。
至于application/json; chartset=utf-8;
无法解析,我在MediaType.pm6
的token
token中加了一个;
,使包含 ;
成为可能(也许这是一个错误,我不知道):
token token { <[A..Za..z0..9;!#$%&'*+^_`{|}~-]>+ }
本地安装,现在解析正常。