小编lpi*_*pil的帖子

如何在GitHub操作中缓存步骤?

假设我有一个包含2个步骤的GitHub动作工作流程。

  1. 下载并编译我的应用程序的依赖项。
  2. 编译并测试我的应用程序

我的依存关系很少更改,并且可以安全地缓存已编译的依存关系,直到我下次更改指定其版本的锁文件为止。

是否可以保存第一步的结果,以便将来的工作流可以跳过该步骤?

github github-actions

26
推荐指数
2
解决办法
4044
查看次数

如果引发编译时警告,是否有可能让编译器提前退出,使构建失败?

我发现编译时警告非常有用,但我偶尔可能会错过它们,特别是如果它是在一个测试在CI服务器上运行的pull请求中.

理想情况下,我会在项目组合文件中指定一些会使编译器更严格的内容.

我希望这对所有混合任务都有效,我不想将标志传递给命令,因为这很容易忘记.

例如,对于带有编译器警告的项目,此命令应该失败

mix clean && mix compile
Run Code Online (Sandbox Code Playgroud)

应该是这个

mix clean && mix test
Run Code Online (Sandbox Code Playgroud)

elixir-mix elixir

9
推荐指数
2
解决办法
1065
查看次数

重新整合Elixir 1.2或更高版本中的协议

我有一个宏,它创建一个模块,一个模块的结构,并实现该结构的协议.

在我的套件中,我有一个简单的测试模块,它调用宏,然后在生成的模块/结构/协议实现上进行断言.一个测试使用struct调用协议函数来断言它已经实现.在1.2之前,这有效,但现在它失败了,运行套件时我收到以下警告.

test/dogma/rule_builder_test.exs:7: warning: the Dogma.Rule \
protocol has already been consolidated, an implementation for \
Dogma.RuleBuilderTest.MagicTestRule has no effect
Run Code Online (Sandbox Code Playgroud)

我现在已经删除了这个测试,因为我相信我的套件的其余部分已经充分测试了这个功能,但是我很好奇是否有办法让这个功能再次运行,或者至少让警告静音.

我玩过Process.consilodate/2,但没有成功.

metaprogramming elixir

7
推荐指数
1
解决办法
300
查看次数

任何单个UTF-8字符上的模式匹配

我想有一个匹配任何单个UTF-8字符的函数子句.

我可以匹配这样的特定字符

def foo("a") do
  "It's an a"
end
Run Code Online (Sandbox Code Playgroud)

但我无法确定是否可以对任何单个UTF8字符执行相同操作.

我目前的解决方案是将字符串拆分为字符列表并进行模式匹配,但我很好奇是否可以跳过该步骤.

binary utf-8 elixir pattern-matching

6
推荐指数
1
解决办法
983
查看次数

当您的项目作为mix dep包含时,防止包含混合任务

我正在编写的Elixir库有两个自定义混合任务,一个用于使我的库成为项目依赖项的用户使用,一个用于仅在我的项目中使用.

这里的问题是,在将我的项目添加为dep之后,两个混合任务都可供其项目中的用户使用.

我该如何防止这种情况?我试图package: [ files: [ etc ] ]在我的Mix配置中避免任务,但它仍然在我的测试项目中可用,它通过git将我的库指定为dep.

elixir-mix elixir hex-pm

6
推荐指数
1
解决办法
77
查看次数

给定模块名称atom,如何为该模块创建结构?

我想转到,MyMod以便%MyMod{}在我正在制作的库中保持与旧配置格式的向后兼容性.

该模块已经定义并调用defstruct宏.

elixir

6
推荐指数
1
解决办法
262
查看次数

将二进制文件从 Docker GitHub Action 添加到 PATH,以供后续工作流程步骤使用

我正在尝试创建一个基于 Dockerfile 的操作,该操作将一个程序添加到 中$PATH,以便以后的操作可以使用它。我的操作运行如下代码:

\n\n
mkdir -p $GITHUB_WORKSPACE/bin\necho "echo Hello, world!" > $GITHUB_WORKSPACE/bin/hello-world\necho "::add-path::$GITHUB_WORKSPACE/bin"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的测试工作流程使用如下:

\n\n
jobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v1.0.0\n      - name: Add program to path\n        uses: ./\n      - name: Use program\n        run: hello-world\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会失败,因为虽然程序已添加到操作中的$GITHUB_WORKSPACE/bin/hello-world值,但工作区步骤中的值不同。$GITHUB_WORKSPACE

\n\n

在action中是\xc2\xa0 /github/workspace/,而在workflow中是/home/runner/work/setup-gleam/setup-gleam/,所以$PATHaction设置的加法不正确。

\n\n

如何从基于 dockerfile 的 GitHub 操作将文件添加到目录,以便它位于工作流程其余部分的路径上?$PATHdockerfile 操作和非 dockerfile 操作之间似乎没有共享可写目录。

\n

docker github-actions

6
推荐指数
1
解决办法
2196
查看次数

在一个进程中多次运行ExUnit测试时,如何避免"警告:重新定义模块Foo"

我希望能够在正在运行的进程中多次运行ExUnit测试,例如iex.

为此,我的代码看起来有点像这样:

def test do
  # Unload test files
  ["test"]
  |> Mix.Utils.extract_files("*")
  |> Enum.map(&Path.expand/1)
  |> Code.unload_files

  # Reenable tasks
  ~w(loadpaths deps.loadpaths test)
  |> Enum.map(&Mix.Task.reenable/1)

  # Run the test suite
  Mix.Task.run("test", args)

  # Cleanup
  :elixir_config.put(:at_exit, [])
end
Run Code Online (Sandbox Code Playgroud)

这可以,但打印test/my_app/foo_test.exs:1 warning: redefining module FooTest我的测试文件中定义的每个模块.

我认为,因为我从:elixir_code_server这些警告中卸载这些文件不会被提出,但事实并非如此.

如果不诉诸沉默stderr等方法,我怎么能沉默或避免这些警告呢?

似乎有一个编译器标志可以用来抑制这些警告,但是没有明确的公共API来设置这个标志.我们似乎可以禁用这些警告消息,没有明确的API可以这样做.

请参阅elixir_compiler:get_opt/1
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/src/elixir_compiler.erl#L8-L13

查看elixir_module:check_module_availability/3它检查的位置elixir_compiler:get_opt(ignore_module_conflict)
https://github.com/elixir-lang/elixir/blob/master/lib/elixir/src/elixir_module.erl#L408-L418

elixir-mix elixir

2
推荐指数
2
解决办法
1801
查看次数