小编bav*_*aza的帖子

在.Net dll中嵌入git commit hash

我正在构建一个C#应用程序,使用Git作为我的版本控制.

有没有办法在构建应用程序时自动将最后一个提交哈希嵌入可执行文件中?

例如,将提交哈希打印到控制台看起来像:

class PrintCommitHash
{
    private String lastCommitHash = ?? // What do I put here?
    static void Main(string[] args)
    {
        // Display the version number:
        System.Console.WriteLine(lastCommitHash );
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这必须在构建时完成,而不是在运行时完成,因为我部署的可执行文件不会访问git repo.

可以在此处找到C++的相关问题.

编辑

Per @ mattanja的请求,我发布了我在项目中使用的git钩子脚本.设置:

  • 钩子是linux shell脚本,位于:path_to_project\.git\hooks下
  • 如果您使用的是msysgit,则hooks文件夹中已包含一些示例脚本.为了让git调用它们,从脚本名称中删除".sample"扩展名.
  • 钩子脚本的名称与调用它们的事件匹配.就我而言,我修改后提交合并后.
  • 我的AssemblyInfo.cs文件直接位于项目路径下(与.git文件夹相同).它包含23行,我使用git生成第24行.

由于我的linux-shelling有点生疏,脚本只是将AssemblyInfo.cs的前23行读取到临时文件,将git散列回到最后一行,然后将文件重命名为AssemblyInfo.cs.我确信有更好的方法可以做到这一点:

#!/bin/sh
cmt=$(git rev-list --max-count=1 HEAD)
head -23 AssemblyInfo.cs > AssemblyInfo.cs.tmp
echo [assembly: AssemblyFileVersion\(\"$cmt\"\)] …
Run Code Online (Sandbox Code Playgroud)

c# git

84
推荐指数
7
解决办法
3万
查看次数

在初始化列表中使用"this"指针是否安全?

我有两个具有父子关系的Parent类(类"has-a" Child类),并且Child该类有一个指向它的指针Parent.在构造子进程时初始化父指针会很好,如下所示:

class Child;
class Parent;

class Child
{
public:
 Child (Parent* parent_ptr_) : parent_ptr(parent_ptr_) {};

private:
 Parent* parent_ptr;
};

class Parent
{
public:
    Parent() : child(this) {};

private:
    Child child;
}
Run Code Online (Sandbox Code Playgroud)

现在,我认识的人建议不使用this在初始化列表,以及C++ FAQ说我会得到一个编译器警告(顺便说一句,在VS2010,我没有得到一个警告),但我真的很喜欢这更好,然后调用一些功能集在Parent的构造函数.我的问题是:

  • 在创建对象this时,父指针是否定义良好Child
  • 如果是这样,为什么如上所述使用它被认为是不好的做法?

谢谢,

波阿斯

编辑:谢谢Timbo,它确实是一个副本(呵呵,我甚至选择了相同的类名).所以让我们获得一些附加值:引用怎么样?是否可以/安全地执行以下操作?:

class Child
{
public:
 Child (Parent& parnet_ptr_) : parent_ptr(parent_ptr_) {};

private:
 Parent* parent_ptr;
};

class Parent
{
public:
    Parent() : child(*this) …
Run Code Online (Sandbox Code Playgroud)

c++ initialization this

48
推荐指数
3
解决办法
2万
查看次数

我必须明确调用原子加载/存储吗?

C++ 11引入了std::atomic<>模板库.该标准指定原子设置/获取由多个线程共享的变量的store()load()操作.

我的问题是分配和访问操作也是原子的吗?

即,是:

std::atomic<bool> stop(false);
...
void thread_1_run_until_stopped()
{
    if(!stop.load())
        /* do stuff */
}

void thread_2_set_stop()
{        
    stop.store(true);
}
Run Code Online (Sandbox Code Playgroud)

相当于:

void thread_1_run_until_stopped()
{
    if(!stop)
        /* do stuff */
}

void thread_2_set_stop()
{        
    stop = true;
}
Run Code Online (Sandbox Code Playgroud)

c++ atomic c++11

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

Python新手@patch装饰器问题

我尝试通过使用@patch以下方法修改测试方法来修补提供程序类:

class TestMyUnit(unittest.TestCase):
...
@patch(provider.Provider,autospec=True)
def test_init(self, mock_provider):
    pass
Run Code Online (Sandbox Code Playgroud)

但是,当我运行测试时,我收到错误:

*@patch(provider.Provider)*  
*File "build\bdist.win32\egg\mock.py", line 1518, in patch*  
*getter, attribute = \_get\_target(target)*  
*File "build\bdist.win32\egg\mock.py", line 1367, in \_get\_target*  
*target, attribute = target.rsplit('.', 1)*  
*AttributeError: class Provider has no attribute 'rsplit'*  
*ERROR: Module: test\_my\_unit could not be imported (file: C:\dev\src\test\_my\_unit.py).*
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

python patch mocking

30
推荐指数
1
解决办法
1万
查看次数

你如何模拟修补python类并为每个实例化获取一个新的Mock对象?

好的,
我知道这在手册中有提及,可能side_effect与/和/有关return_value,但一个简单直接的例子对我帮助很大.

我有:

class ClassToPatch():
   def __init__(self, *args):
       _do_some_init_stuff()

   def some_func():
       _do_stuff()


class UUT():
    def __init__(self, *args)
       resource_1 = ClassToPatch()
       resource_2 = ClassToPatch()
Run Code Online (Sandbox Code Playgroud)

现在,我想对这个UUT类进行单元测试,然后嘲笑ClassToPatch.知道UUT该类将实例化两个ClassToPatch对象,我希望Mock框架为每个实例化返回一个新的Mock对象,所以我可以稍后在每个实例上断言.

如何@patch在测试用例中使用装饰器实现此目的?即,如何修复以下代码示例?

class TestCase1(unittest.TestCase):

    @patch('classToPatch.ClassToPatch',autospec=True)
    def test_1(self,mock1,mock2):
        _assert_stuff()
Run Code Online (Sandbox Code Playgroud)

python mocking python-mock python-unittest

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

使用django-rest-framework序列化对象列表

DRF中,我可以像这样序列化本机Python对象:

class Comment(object):
    def __init__(self, email, content, created=None):
        self.email = email
        self.content = content
        self.created = created or datetime.now()

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

comment = Comment(email='leila@example.com', content='foo bar')
serializer = CommentSerializer(comment)
serializer.data

# --> {'email': 'leila@example.com', 'content': 'foo bar', 'created': '2016-01-27T15:17:10.375877'}
Run Code Online (Sandbox Code Playgroud)

是否可以对使用的对象列表执行相同操作ListSerializer

django django-rest-framework

23
推荐指数
1
解决办法
2万
查看次数

哪些阻塞操作导致STA线程泵送COM消息?

当一个COM对象在STA线程上实例化时,该线程通常必须实现一个消息泵,以便为来回调用其他线程(见这里).

可以手动泵送消息,或者依赖于某些(但不是全部)线程阻塞操作在等待时自动泵送COM相关消息的事实.文档通常无助于决定哪个是哪个(参见相关问题).

如何确定线程阻塞操作是否会在STA上泵送COM消息?

到目前为止的部分清单:

阻断其业务泵*:

阻止泵送的操作:

*注意Noseratio的答案说,即使是操作泵,也是为非常有限的未公开的COM特定消息集.

c# com interop message-pump

17
推荐指数
1
解决办法
3534
查看次数

CreateDirectory()在C#中是否是线程安全的?

我可以安全地尝试从两个不同的线程创建相同的目录,而不会让其中一个抛出异常,或遇到其他问题吗?

请注意,根据MSDN,可以调用CreateDirectory()已存在的目录,在这种情况下,该方法不会执行任何操作.

c# thread-safety create-directory

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

如何将消息发布到运行消息泵的STA线程?

因此,在此之后,我决定在专用的STA线程上显式实例化COM对象.实验表明COM对象需要一个消息泵,我通过调用它来创建Application.Run():

private MyComObj _myComObj;

// Called from Main():
Thread myStaThread = new Thread(() =>
{
    _myComObj = new MyComObj();
    _myComObj.SomethingHappenedEvent += OnSomthingHappened;
    Application.Run();
});
myStaThread.SetApartmentState(ApartmentState.STA);
myStaThread.Start();
Run Code Online (Sandbox Code Playgroud)

如何从其他线程发布STA线程的消息泵消息?

注意: 为了简洁起见,我对问题进行了大量编辑.@Servy的答案的某些部分现在似乎无关紧要,但它们是针对原始问题的.

c# com interop message-queue sta

14
推荐指数
1
解决办法
8494
查看次数

C#将字符串解析为在运行时已知的类型

我有一个文件包含一个类的一些变量,每一行都是一对:变量,值.我正在寻找一种方法来在运行时加载这些(a-la XmlSerializer),使用反射.

有没有办法在运行时解析stringType已知的?

以下是一个如意的代码示例,其中最后一行(pi.SetValue()不正确,因为PropertyTypeType没有泛型Parse()方法的类).

using (var sr = new StreamReader(settingsFileName))
{
    String  line;
    while ((line = sr.ReadLine()) != null)
    {
        String[] configValueStrs = line.Trim().Split(seps);

        PropertyInfo pi = configurableProperties
                .Single(p => p.Name == configValueStrs[0].Trim());

        //How do I manage this?
        pi.SetValue(this, pi.PropertyType.Parse(configValueStrs[1].Trim()), null);
     }
 }
Run Code Online (Sandbox Code Playgroud)

由于所有相关变量都是Ints,Doubles,Strings或Booleans,作为最后的手段,我可​​以打开类型并使用相应的ToType()方法,但我敢打赌,有一个更优雅的解决方案.

c# string parsing

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