我不太明白如何使用setuptools-scm。
据我了解,这个工具应该根据 SCM(在我的例子中是 git)历史记录得出版本号。它基本上使用距最新标签的距离来获取此信息。
现在,假设我有一个项目,我们在其中工作:我们有main和develop分支。我们使用 SemVer,因此我们有一个x.y.z版本模式。现在,每当我们提交时develop,我们都希望在我们的包注册表中拥有最新的包。因此,如果主分支上的最新版本是1.2.3例如,我们希望获得1.2.3.dev1、1.2.3.dev2等。
我实际看到发生的情况是,如果我有1.2.3最新的标签,setuptools-scm 会将下一个版本定义为1.2.4,另外,它会在版本中添加+g532hj..,而注册表等注册表PyPI Test不接受该版本。
有人能具体解释一下它是如何使用的吗?
我对 CMake 还很陌生,我的问题是:
假设我们有一个简单的项目,只有
main.cpp
Run Code Online (Sandbox Code Playgroud)
使用
header.h
Run Code Online (Sandbox Code Playgroud)
我想使用 CMake 构建这个项目,所以我有一个最小的
CMakeLists.txt,其中仅包含以下内容(仅包含相关内容):
add_executable(MyApp main.cpp)
Run Code Online (Sandbox Code Playgroud)
是否有理由将 包含header.h在 中CMakeLists.txt?
据我所见,如果我修改并再次header.h运行,
它会按预期更新。cmake
我正在学习 Powershell 中的范围并且有一些问题:
local修饰符?您可以通过运行脚本或函数、创建会话或启动 PowerShell 的新实例来创建新范围。创建新作用域时,结果是父作用域(原始作用域)和子作用域(您创建的作用域)。...
除非您明确将项目设为私有,否则父范围中的项目可用于子范围。但是,您在子作用域中创建和更改的项不会影响父作用域,除非您在创建项时明确指定作用域。
但是当我尝试以下操作时:
PS> $Name = "John"
PS> Powershell.exe
PS>echo $Name // No Output
Run Code Online (Sandbox Code Playgroud)
从上面的引用看来,“启动一个新的 powershell 实例”是一个子作用域,所以父作用域中的所有项目都应该在那里可见。有人可以解释一下吗?
我在这里Dockerfile找到了这个样本:
// version 1
FROM ubuntu:latest
RUN apt update && apt install ssh -y
RUN service ssh start
CMD ["/usr/sbin/sshd","-D"]
Run Code Online (Sandbox Code Playgroud)
当我构建并运行它时Dockerfile,它在前台运行一个 SSH 服务器,这很棒。
如果我使用以下内容Dockerfile:
// version 2
FROM ubuntu:latest
RUN apt update && apt install ssh -y
RUN service ssh start
# CMD ["/usr/sbin/sshd","-D"] // without this line
Run Code Online (Sandbox Code Playgroud)
然后运行容器:
~$ docker run -p 2222:22 -it ssh_server
Run Code Online (Sandbox Code Playgroud)
并尝试从另一个终端连接它,它不起作用。看来对 sshd 的调用是必要的。另一方面,如果我只是在 Dockerfile 中安装 SSH:
// version 3
FROM ubuntu:latest
RUN apt-get update && apt-get install …Run Code Online (Sandbox Code Playgroud) 当我了解天蓝色管道时,我几乎到处都会
遇到术语“编译时”和“运行时”。
但是,我仍然没有找到关于它们的明确解释。
我在微软的文档中找到了这个页面,但它并没有非常清楚地解释这些术语。
如果有人可以在Azure Pipelines 的整个运行顺序的上下文中解释这些术语,我会很高兴。
谢谢!
我在 Jenkins 共享库中遇到了一些行为,如果有人可以向我解释这一点,那就太好了:
假设我的vars目录中有一个文件:
// MultiMethod.groovy
def Foo() { ... }
def Bar() { ... }
Run Code Online (Sandbox Code Playgroud)
现在,如果我想使用管道中的这些函数,我所做的是:
// Jenkinsfile
@Library('LibName') _
pipeline {
...
steps {
script {
// Method (1): this will work
def var = new MultiMethod()
var.Foo()
var.Bar()
// Method (2) this will not work
MultiMethod.Foo()
}
}
}
Run Code Online (Sandbox Code Playgroud)
((1)和(2)方法是调用groovy脚本中方法的方法。请不要被这两种“方法”一词的用法所混淆。)
MultiMethod所以只有当我用运算符实例化它时它才有效new。
但是,如果我将文件命名为multiMethod(camelCased) 而不是MultiMethod,我可以使用方法 (2) 来调用脚本中的方法。有人可以解释这种行为吗?
这似乎运作良好。
基于上面的例子。如果我有一个名为 的常规文件MultiMethod(我们之前看到,如果我用 with 实例化,我可以使用它的方法new),我似乎无法MultiMethod在动态加载库时实例化一个对象,如下所示: …
git tag 文档说你可以标记提交或对象:
<commit>
<object>
新标记将引用的对象,通常是提交。默认为 HEAD。
事实上,您可以获取 blob 对象的哈希值并对其进行标记。但我不明白——它有什么用?你可以用这个标签做什么?
我在一些地方读到过,一般来说,Python 不提供向后兼容性,这意味着任何较新版本的 Python 都可能会破坏在早期版本中运行良好的代码。如果是这样,作为开发人员,我如何知道哪些版本的 Python 可以成功执行我的代码?对此有什么规则/保证吗?或者我应该告诉我的用户:只需使用 Python 3.8(例如)运行它 - 不多也不少......?
我一直在阅读Jeff Preshing 的这篇关于 Synchronizes-With Relation 的文章,以及cpp 参考中的std::memory_order页面中的“Release-Acquire Ordering”部分,但我不太明白:
似乎标准有某种承诺,但我不明白为什么有必要。让我们以 CPP 参考中的示例为例:
#include <thread>
#include <atomic>
#include <cassert>
#include <string>
std::atomic<std::string*> ptr;
int data;
void producer()
{
std::string* p = new std::string("Hello");
data = 42;
ptr.store(p, std::memory_order_release);
}
void consumer()
{
std::string* p2;
while (!(p2 = ptr.load(std::memory_order_acquire)))
;
assert(*p2 == "Hello"); // never fires
assert(data == 42); // never fires
}
int main()
{
std::thread t1(producer);
std::thread t2(consumer);
t1.join(); t2.join();
}
Run Code Online (Sandbox Code Playgroud)
参考文献解释说:
如果线程 A 中的原子存储标记为 memory_order_release,并且线程 B …
执行这样的脚本时:
nonexistingcommand
echo "Hello"
Run Code Online (Sandbox Code Playgroud)
我得到:
nonexistingcommand : The term 'nonexistingcommand' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the
name, or if a path was included, verify that the path is correct and try again.
At D:\Playground\powershell\Test.ps1:2 char:1
+ nonexistingcommand
+ ~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (nonexistingcommand:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
Hello
Run Code Online (Sandbox Code Playgroud)
所以看起来这CommandNotFoundException是一个非终止错误。那么为什么如果我
try {
nonexistingcommand
}
catch [System.Management.Automation.CommandNotFoundException] {
throw
}
echo "Hello"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它将退出并且不打印“Hello”。 …
我注意到,当ForEach在数组对象上运行并将输出捕获到新变量时,新变量不是 System.array 类型:
PS D:\Playground> $Arr = 1, 2, 3
PS D:\Playground> $Arr2 = $Arr.ForEach({$_})
PS D:\Playground> $Arr2.Gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Collection`1 System.Object
Run Code Online (Sandbox Code Playgroud)
相反,它是 类型Collection'1。
这是什么类型?它相当于数组吗?
顺便说一句,这与以下内容不同ForEach-Object:
PS D:\Playground> $Arr3 = $($Arr | ForEach-Object { $_ })
PS D:\Playground> $Arr3.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
Run Code Online (Sandbox Code Playgroud) 我有一个主分支,我想要一个脚本来检测远程主分支是否已更新。我知道我可以这样做:
git fetch
Run Code Online (Sandbox Code Playgroud)
现在当我跑步时
git diff master origin/master
Run Code Online (Sandbox Code Playgroud)
我得到输入。
问题是,在脚本中检测这一点的最佳方法是分析文本输出吗?感觉不太稳定..有什么想法吗?
在 Bash 参考手册第 4.1 章中,关于测试命令的部分:
可以使用以下运算符组合表达式,按优先级降序列出。评估取决于参数的数量;见下文。当有五个或更多参数时,使用运算符优先级。
!expr 如果 expr 为假则为真。
( expr ) 返回 expr 的值。这可用于覆盖运算符的正常优先级。
...
由此看来,人们可以做类似的事情:
if [ 3 == 2 -a (2 == 2 -o 2 == 2) ];
Run Code Online (Sandbox Code Playgroud)
在这种情况下,括号 () 将覆盖正常优先级(首先是 -a,在这种情况下整个表达式将为 true),但是当我尝试运行它时,我得到:
/test.sh: line 3: syntax error near unexpected token `('
./test.sh: line 3: `if [ 3 == 2 -a (2 == 2 -o 2 == 2) ];'
Run Code Online (Sandbox Code Playgroud)