因此,如果您已经有二进制文件,可以使用'install_name_tool'在OSX上添加一个rpath,如下所示:
install_name_tool -add_rpath @executable_path/blah
Run Code Online (Sandbox Code Playgroud)
当您构建应用程序包时,xcode会自动执行此操作.
我知道在cmake中你可以使用它来设置共享库的install_name:
set_target_properties(nshared PROPERTIES BUILD_WITH_INSTALL_RPATH 1 INSTALL_NAME_DIR "@rpath")
Run Code Online (Sandbox Code Playgroud)
我的问题是,为二进制文件添加rpath相当于什么呢?
(对于'为什么你会这样做?',在你的应用程序/文件夹中的任何应用程序上查看otool -l,你会看到很多应用程序的条目如下:
Load command 15
cmd LC_RPATH
cmdsize 36
path @executable_path/../../Frameworks/
Run Code Online (Sandbox Code Playgroud)
这是标准做法.我只是想在cmake中做到这一点)
当我编写接口时,通常可以方便地在与接口相同的包中定义我的测试,然后定义实现接口集的多个包,例如.
package/
package/impl/x <-- Implementation X
package/impl/y <-- Implementation Y
Run Code Online (Sandbox Code Playgroud)
有没有一种简单的方法可以在子包中运行相同的测试套件(在本例中,位于package/*_ test.go中)?
我到目前为止提出的最佳解决方案是添加一个测试包:
package/tests/
Run Code Online (Sandbox Code Playgroud)
它实现了测试套件,并在每个实现中进行测试以运行测试,但这有两个缺点:
1)包/测试中的测试不在_test.go文件中,最终成为实际库的一部分,由godoc等记录.
2)包/测试中的测试由自定义测试运行器运行,该测试运行器必须基本上复制'go test'的所有功能以扫描go测试并运行它们.
看起来像一个非常俗气的解决方案.
有没有更好的方法呢?
考虑一下,对于toml节点模块,我可以简单地使用:
// toml.d.ts
declare module TOML {
export function parse(value:string):any;
}
declare module "toml" {
export = TOML;
}
Run Code Online (Sandbox Code Playgroud)
然后:
/// <reference path="../../../../../defs/toml/toml.d.ts"/>
import toml = require('toml');
toml.parse(...);
Run Code Online (Sandbox Code Playgroud)
但是,那些只导出单个函数的节点模块呢,比如'glob'(https://github.com/isaacs/node-glob).
该模块的节点用法是:
var glob = require("glob")
glob("*.js", {}, callback(err, files) { ... });
Run Code Online (Sandbox Code Playgroud)
你天真地期望你能做到这一点:
// glob.d.ts
declare function globs(paths:string, options:any, callback:{(err:any, files:string[]):void;
Run Code Online (Sandbox Code Playgroud)
...但是因为typescripts'import'语义有点奇怪,所以你似乎只能使用'import .. = require()'语句来为别名模块.试着打电话:
/// <reference path="../../../../../defs/glob/glob.d.ts"/>
import blog = require('glob');
Run Code Online (Sandbox Code Playgroud)
结果是:
error TS2072: Module cannot be aliased to a non-module type.
Run Code Online (Sandbox Code Playgroud)
NB.请注意,这是针对使用节点的commonjs模块, …
class ITestType(object):
""" Sample interface type """
__metaclass__ = ABCMeta
@abstractmethod
def requiredCall(self):
return
class TestType1(object):
""" Valid type? """
def requiredCall(self):
pass
class TestType2(ITestType):
""" Valid type """
def requiredCall(self):
pass
class TestType3(ITestType):
""" Invalid type """
pass
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,issubclass(TypeType*, ITestType)对于2返回true,对于1和3返回false.
是否有另一种方法可以使用issubclass,或者一种替代方法进行接口测试,允许1 和 2通过,但拒绝3?
能够使用duck typing而不是将类显式绑定到抽象类型对我来说非常有帮助,但是当duck-typed对象通过特定接口时也允许对象检查.
是的,我知道python人不喜欢接口,标准方法是"在失败时找到它并将所有内容包装在异常中",但也与我的问题完全无关.不,我不能简单地不在这个项目中使用接口.
编辑:
完善!对于发现此问题的任何其他人,以下是如何使用subclasshook的示例:
class ITestType(object):
""" Sample interface type """
__metaclass__ = ABCMeta
@abstractmethod
def requiredCall(self):
return
@classmethod
def __subclasshook__(cls, C):
required = ["requiredCall"]
rtn = True
for r in required:
if …Run Code Online (Sandbox Code Playgroud) 某些库和站点(如kotti)公开从配置文件加载的数据库会话(它使用金字塔).
通常,您可以忽略sqlalchemy的驱动程序,但是有一些问题,例如获取随机行和使用带有sqlite的时区,这需要您具有针对不同引擎的特定行为.
事实是,我无法看到如何确定您在运行时使用的驱动程序.
你怎么做到这一点?
具体来说,如何从会话(不是引擎或会话工厂)向后工作并弄清楚这一点?
我已经在不同的地方看过这个问题,答案就像'使用cmd/foo,cmd/bar'类型的文件夹结构.
这对我不起作用.
这有效:
$ du -a
8 ./src/cmd/bin1/main.go
8 ./src/cmd/bin1
8 ./src/cmd/bin2/main.go
8 ./src/cmd/bin2
16 ./src/cmd
8 ./src/shared/foo/foo.go
8 ./src/shared/foo
8 ./src/shared
24 ./src
Run Code Online (Sandbox Code Playgroud)
并建立它:
go build ./src/cmd/bin2
go build ./src/cmd/bin1
Run Code Online (Sandbox Code Playgroud)
但是,我无法弄清楚有什么变化:
go build ./src/...
Run Code Online (Sandbox Code Playgroud)
我可能需要一步构建所有这些二进制文件.
这个布局:
$ du -a
8 ./cmd/bin1/main.go
8 ./cmd/bin1
8 ./cmd/bin2/main.go
8 ./cmd/bin2
16 ./cmd
8 ./src/shared/foo/foo.go
8 ./src/shared/foo
8 ./src/shared
8 ./src
24 .
Run Code Online (Sandbox Code Playgroud)
似乎完全无法使用.没有go build ...命令组合似乎构建bin1或bin2.
我能得到的最好的是go build cmd/bin1/main.go给我一个名为'main'的二进制文件.没用.
因此,具体而详细地说,包括go build实际构建单个二进制文件的命令,你是如何做到这一点的?
...为什么人们一直在使用顶级cmd文件夹的默认建议?如果你这样做,你如何构建这些二进制文件?
我怎么可以导出一个CMake的库所依赖的库,使得根据该库的可执行文件不必手动依赖于该库的依赖?
这有点拗口,所以这是一个例子:
dummy(application)---->依赖于liba
liba ---->取决于libpng
编译虚拟生成错误:
-- Found LIBPNG
-- Found LIBA
-- Configuring done
-- Generating done
-- Build files have been written to: /home/doug/projects/dummy/build
Linking C executable dummy
../deps/liba/build/liba.a(a.c.o): In function `a_dummy':
/home/doug/projects/dummy/deps/liba/src/a.c:6: undefined reference to `png_sig_cmp'
collect2: ld returned 1 exit status
make[2]: *** [dummy] Error 1
make[1]: *** [CMakeFiles/dummy.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)
我可以通过将其添加到CMakeLists.txt中来解决这个问题:
TARGET_LINK_LIBRARIES(虚拟png)
但是,dummy不知道liba如何实现其api.在某些时候,可能会变成libjpg或其他东西,这会破坏虚拟应用程序.
在从cmake邮件列表获得一些帮助之后,我被引导到这个例子来导出东西:http: //www.cmake.org/Wiki/CMake/Tutorials/How_to_create_a_ProjectConfig.cmake_file
然而,遵循这种方法让我陷入这条线:
export(TARGETS $ {LIBPNG_LIBRARY} FILE"$ {PROJECT_BINARY_DIR} /ALibraryDepends.cmake") …
我似乎在我的代码中做了这么多:
public class ActionsModule : Module
{
protected override void Load(ContainerBuilder builder)
{
base.Load(builder);
builder.Register(c => LogManager.GetCurrentClassLogger()).As<ILog>().InstancePerDependency();
// Autofac doesn't seem to be able to inject things without explicit binding
builder.RegisterType<ComboActions>().As<ComboActions>().InstancePerHttpRequest();
builder.RegisterType<AppActions>().As<AppActions>().InstancePerHttpRequest();
}
}
}
Run Code Online (Sandbox Code Playgroud)
'actions'类是一个类,我需要将其注入到我的控制器中,并具有各种其他子依赖项.
似乎有点垃圾.为什么autofac无法解析该类是否具有已满足依赖关系的构造函数并自动生成实例?
我的意思是,如果A类需要注入B类而B类需要C,D,E等等,我想你不想走遍整个依赖链,看看你是否可以在运行时创建一个类....但是如果A类直接依赖于明确约束的C和D,那肯定是一个微不足道的案例?
我错过了什么吗?似乎没有看到任何相关的文档......
是否可以在没有标准库的情况下嵌入python?
我正在使用python 2.7.6的cmake构建,我已经运行了一个基本的嵌入式脚本,如下所示:
#include <stdio.h>
#include <Python.h>
int main(int argc, char *argv[]) {
/* Setup */
Py_SetProgramName(argv[0]);
Py_Initialize();
/* Run the 'main' module */
int rtn = Py_Main(argc, _argv);
Py_Finalize();
return rtn;
}
Run Code Online (Sandbox Code Playgroud)
..但是当我运行它时,我得到:
ImportError: No module named site
Run Code Online (Sandbox Code Playgroud)
如果我设置了正确的$ PYTHONHOME,它可以正常工作; 但这不是我想要做的.我试图在没有标准库的独立应用程序中嵌入python的副本.
我很欣赏它的使用,但对于这个特定的嵌入式环境,我想要更像lua的东西(但显然有python语法),其中只有父应用程序公开的特定库可用.
这还有一个额外的好处,即不关心分发(或构建)标准库及其所有交叉链接的动态库.
这有可能吗?或者我不可避免地会发现缺少语言的基本块,如sys.path,import,{},[]或类似标准库的一部分?
如果有可能,你会怎么做呢?
关于http.Request在go中使用发布文件的教程很多,但几乎总是这样开始:
file, err := os.Open(path)
if err != nil {
return nil, err
}
fileContents, err := ioutil.ReadAll(file)
Run Code Online (Sandbox Code Playgroud)
也就是说,您将整个文件读入内存,然后将其转换为a Buffer并将其传递给请求,如下所示:
func send(client *http.Client, file *os.File, endpoint string) {
body := &bytes.Buffer{}
io.Copy(body, file)
req, _ := http.NewRequest("POST", endpoint, body)
resp, _ := client.Do(req)
}
Run Code Online (Sandbox Code Playgroud)
如果你想发布一个庞大的文件并避免将其读入内存,而是将文件以块的形式提升......你会怎么做?
go ×3
python ×3
cmake ×2
autofac ×1
c ×1
c# ×1
commonjs ×1
macos ×1
sqlalchemy ×1
typescript ×1