我正在构建一个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-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) 我有两个具有父子关系的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++ 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) 我尝试通过使用@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)
有任何想法吗?
好的,
我知道这在手册中有提及,可能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) 在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?
当一个COM对象在STA线程上实例化时,该线程通常必须实现一个消息泵,以便为来回调用其他线程(见这里).
可以手动泵送消息,或者依赖于某些(但不是全部)线程阻塞操作在等待时自动泵送COM相关消息的事实.文档通常无助于决定哪个是哪个(参见相关问题).
如何确定线程阻塞操作是否会在STA上泵送COM消息?
到目前为止的部分清单:
阻断其业务做泵*:
Thread.JoinWaitHandle.WaitOne/ WaitAny/WaitAll(WaitAll不能从一个STA线程虽然称为)GC.WaitForPendingFinalizersMonitor.Enter(因此lock) - 在某些条件下ReaderWriterLock阻止不泵送的操作:
Thread.SleepConsole.ReadKey (在某处读)*注意Noseratio的答案说,即使是操作泵,也是为非常有限的未公开的COM特定消息集.
我可以安全地尝试从两个不同的线程创建相同的目录,而不会让其中一个抛出异常,或遇到其他问题吗?
请注意,根据MSDN,可以调用CreateDirectory()已存在的目录,在这种情况下,该方法不会执行任何操作.
因此,在此之后,我决定在专用的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的答案的某些部分现在似乎无关紧要,但它们是针对原始问题的.
我有一个文件包含一个类的一些变量,每一行都是一对:变量,值.我正在寻找一种方法来在运行时加载这些(a-la XmlSerializer),使用反射.
有没有办法在运行时解析string为Type已知的?
以下是一个如意的代码示例,其中最后一行(pi.SetValue()不正确,因为PropertyType是Type没有泛型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()方法,但我敢打赌,有一个更优雅的解决方案.