有时,重建整个站点并强制bower重新安装bower.json中所有软件包的新版本是有用的.
但是,似乎没有办法做到这一点:
$ bower uninstall
bower not-installed 0
Run Code Online (Sandbox Code Playgroud)
不,这只能逐个打包,即使干净的'bower install'使用bower.json.
$ bower install -f -l 0
$
Run Code Online (Sandbox Code Playgroud)
不,尽管'-f',如果满足依赖关系,这绝对没有任何意义.
$ rm -r bower_components
$
Run Code Online (Sandbox Code Playgroud)
!啊胜利!......等等,这是什么?
rm: bower_components: No such file or directory
Run Code Online (Sandbox Code Playgroud)
哦,这个项目中有一个.bowrc,用于设置安装目录的目录.
运行自定义脚本:
- Parse .bowerrc if one exists
- Load the directory if one is specified in the json block
- If the directory currently exists...
- ...recursively delete the directory.
Run Code Online (Sandbox Code Playgroud)
我认为它可以工作,但重复设置非常烦人.
我错过了什么吗?
是否有一个简单的bower命令来删除本地安装的模块?
看起来像我希望凉亭卸载的真正基本功能.
(这不是一个非常简单的javascript问题,但我很乐意接受一些挂钩到bower模块的东西,以便在一个简单的节点脚本中实现这一点)
编辑:如果你想要这样一个任务的"动力",那就是:我们有一个jenkins服务器来构建我们的项目并运行测试.然而,由于没有明显的原因,它会定期失败; 调查,几乎总是因为jenkins在构建和运行测试之前只使用git-pull来使用存储库的先前副本来更新到最新版本; 结果,之前的bower_components目录就在那里,并且它充满了各种组件的缓存副本.
这里有几个例子是#@ $ @#$'d并要求bower再次作为强制安装运行: …
我猜你做的事情是这样的:
extern crate uuid;
use uuid::Uuid;
use std::fmt::Formatter;
use std::fmt::Debug;
#[derive(Debug)]
struct BlahLF {
id: Uuid,
}
impl BlahLF {
fn new() -> BlahLF {
return BlahLF { id: Uuid::new_v4() };
}
}
impl Debug for BlahLF {
fn fmt(&self, &mut f: Formatter) -> Result {
write!(f.buf, "Hi: {}", self.id);
}
}
Run Code Online (Sandbox Code Playgroud)
...但是尝试实现此特征会产生:
error[E0243]: wrong number of type arguments
--> src/main.rs:19:41
|
19 | fn fmt(&self, &mut f: Formatter) -> Result {
| ^^^^^^ expected 2 type arguments, found 0 …Run Code Online (Sandbox Code Playgroud) 所以团队中有很多东西建议你可以在go中执行此操作(尽管不在cgo文档中):
package bridge
import "fmt"
// #cgo CFLAGS: -I/Users/doug/projects/c/go-bridge/include
// #cgo LDFLAGS: /Users/doug/projects/c/go-bridge/build/libgb.a
// #include <junk.h>
import "C"
func Run() {
fmt.Printf("Invoking c library...\n")
C.x(10)
fmt.Printf("Done\n")
}
Run Code Online (Sandbox Code Playgroud)
但是,它似乎不起作用:
/var/folders/.../bridge.a(bridge.cgo2.o)(__TEXT/__text): x: not defined
Run Code Online (Sandbox Code Playgroud)
这似乎可以正常使用动态库,并检查生成的文件,它实际上有符号'x':
/var/folders/rg/hj4s3qlj3sz1d1b5p50ws0vc0000gn/T/go-build442792776/bridge/_obj/_cgo_.o:
0000000100001048 S _NXArgc
0000000100001050 S _NXArgv
0000000100001060 S ___progname
0000000100000dc0 T __cgo_2d7eefe3d6d4_Cfunc_x
0000000100000da0 T __cgo_allocate
0000000100000db0 T __cgo_panic
0000000100000000 T __mh_execute_header
0000000100000d90 T _crosscall2
0000000100001058 S _environ
U _exit
0000000100000d80 T _main
U _puts
0000000100001000 s _pvars
0000000100000de0 T _x <------- Exists
U dyld_stub_binder
0000000100000d40 T …Run Code Online (Sandbox Code Playgroud) 我刚刚发现了vim的taglist插件,并阅读了如何将它与ctags一起使用.
然而,令人失望的是ctags是一个非常简单的解析器.
有没有更完整的替代方案?
具体来说,我正在寻找一些东西:
扩展#define(x, y) x ## y函数声明的样式宏
处理#include陈述
允许为依赖项指定包含路径
我看到clang提供了一个用于访问c AST的程序api,所以这肯定不是很难吗?
有人已经做过吗?
-
编辑:
这些不削减它:
clang_indexer - 不编译; 什么时候(黑客攻击后),不起作用(无休止的错误).
clang_complete - 似乎没有比ctags好.没有特定于上下文的建议,没有结构完成,没有函数参数,没有宏扩展; 只是一个符号列表和它们来自的文件.
如果您有这样的目录结构:
src/main.rs
src/module1/blah.rs
src/module1/blah2.rs
src/utils/logging.rs
Run Code Online (Sandbox Code Playgroud)
你如何使用其他文件中的函数?
从Rust教程,听起来我应该能够做到这一点:
main.rs
mod utils { pub mod logging; }
mod module1 { pub mod blah; }
fn main() {
utils::logging::trace("Logging works");
module1::blah::doit();
}
Run Code Online (Sandbox Code Playgroud)
logging.rs
pub fn trace(msg: &str) {
println!(": {}\n", msg);
}
Run Code Online (Sandbox Code Playgroud)
blah.rs
mod blah2;
pub fn doit() {
blah2::doit();
}
Run Code Online (Sandbox Code Playgroud)
blah2.rs
mod utils { pub mod logging; }
pub fn doit() {
utils::logging::trace("Blah2 invoked");
}
Run Code Online (Sandbox Code Playgroud)
但是,这会产生错误:
error[E0583]: file not found for module `logging`
--> src/main.rs:1:21
|
1 | mod utils { pub …Run Code Online (Sandbox Code Playgroud) 我知道答案是"你不应该"......但是为了争论,你应该怎么做?
例如,如果你想编写一个替代方案,Vec<T>那就有所不同.
我看到你可以通过将* mut T值转换u64并添加到它们中来制作"编译和运行的东西" ,然后将它们转换回* mut T并读取指针处的值(参见下面的示例).它似乎有效,但它留下了一些悬而未决的问题:
将一个* mut T指针总是适合u64?
write()当数据是来自的任意(即非托管类型)数据块时,是否会发生不安全的指针触发指针别名问题libc:calloc?
这只能起作用,因为我使用的是原始类型(f64).如果这是一个真正的数据对象,我将forget()首先得到该对象; 但你只需write()一个* mut T到目标,然后高高兴兴地read()出来以后再如果类型是复杂的,有孩子的记录?
这真的是这样做的正确方法吗?这看起来非常尴尬.我期待找到一些不安全ptrtoint()/ inttoptr()配对,但我找不到那样的东西.
extern crate libc;
use std::mem::size_of;
use std::ptr::write;
use std::ptr::read;
use std::mem::transmute;
use libc::calloc;
use libc::free;
use libc::c_void;
struct Array {
length: usize,
data: *mut f64,
}
impl Array {
fn new(length: …Run Code Online (Sandbox Code Playgroud) 我不喜欢基于构造函数的依赖注入.
我认为这会增加代码复杂性并降低可维护性,我想知道是否有任何可行的替代方案.
我不是在讨论将实现与接口分离的概念,而是有一种从接口动态解析(递归)一组对象的方法.我完全支持这一点.但是,传统的基于构造函数的方法似乎有一些问题.
1)所有测试都取决于构造函数.
在去年的MVC 3 C#项目中广泛使用DI后,我发现我们的代码中包含以下内容:
public interface IMyClass {
...
}
public class MyClass : IMyClass {
public MyClass(ILogService log, IDataService data, IBlahService blah) {
_log = log;
_blah = blah;
_data = data;
}
...
}
Run Code Online (Sandbox Code Playgroud)
问题:如果我在实现中需要另一个服务,我必须修改构造函数; 这意味着该类的所有单元测试都会中断.
即使与新功能无关的测试也需要至少重构以添加其他参数并为该参数注入模拟.
这似乎是一个小问题,像resharper这样的自动化工具有所帮助,但是当这样的简单改变导致100多个测试中断时,它肯定很烦人.实际上我已经看到人们在做愚蠢的事情以避免更改构造函数而不是咬紧牙关并在发生这种情况时修复所有测试.
2)服务实例不必要地传递,增加了代码复杂性.
public class MyWorker {
public MyWorker(int x, IMyClass service, ILogService logs) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
如果我可以在给定服务可用并且已经自动解析的上下文(例如控制器)内,或者不幸的是,通过将服务实例传递给多个辅助类链来创建此类的实例.
我看到这样的代码,所有的时间:
public class BlahHelper {
// Keep so we can create objects later
var _service = null;
public …Run Code Online (Sandbox Code Playgroud) 我使用以下方法创建了一个文件列表:
file(GLOB_RECURSE DEPLOY_FILES "${PROJECT_SOURCE_DIR}/install/*")
Run Code Online (Sandbox Code Playgroud)
我想安装所有这些文件/usr/myproject/,但我想在已安装的文件夹上维护文件树:
install/junk
install/other/junk2
install/other/junk3
Run Code Online (Sandbox Code Playgroud)
如果我使用:
install(FILES ${DEPLOY_FILES} DESTINATION "usr/myproject")
Run Code Online (Sandbox Code Playgroud)
所有文件最终都在/ usr/myproject中:
/usr/myproject/junk
/usr/myproject/junk2
/usr/myproject/junk3
Run Code Online (Sandbox Code Playgroud)
如何使安装命令跟踪相对路径?
我通过在for循环中手动执行来解决这个问题:
set(BASE "${PROJECT_SOURCE_DIR}/install")
foreach(ITEM ${DEPLOY_FILES})
get_filename_component(ITEM_PATH ${ITEM} PATH)
string(REPLACE ${BASE} "" ITEM_PATH ${ITEM_PATH})
install(FILES ${ITEM} DESTINATION "usr/myproject${ITEM_PATH}")
endforeach()
Run Code Online (Sandbox Code Playgroud)
......但这很烦人.当然有一种更简单的方法吗?
(虽然我在安装文档中看不到任何内容...)
......它在哪里记录?
我在这个地方看过这样的例子:
class MyThing {
private _layers: { [id: string] : SimpleLayer } = {};
...
}
Run Code Online (Sandbox Code Playgroud)
......这很有用,这很棒,但语法让我感到困惑.
什么是'id'?为什么语法不仅仅是blah:{string:SimpleLayer},它不起作用.我还看到{[name:string]:Type}和{[index:string]:Type}.
我一直在寻找typescriptlang.org试图找到实际记录的位置,但我似乎根本找不到它.
在answers.unrealengine.com上有一些手动的答案,但他们似乎缺乏任何细节或例子.
具体而言,详细地说,如果你想实现一组在3D游戏世界中渲染的动态纹理四边形,你会怎么做?
对于用例,请考虑使用Spriter动画的2dish侧卷轴.2D动画很容易从XML加载,但是如何在场景中动态渲染这组2D纹理,旋转和缩放四边形?