Я только что создал плагин для клиента, позволив им записать код C# в модулях, которые действуют как VBA, делает для Office.
In terms of dependencies, what you want is for all the test actions to depend on all the program-built actions. A way of doing this is to create and export a dummy-target to all the subdirectories' sconscript files, and in the sconscript files, make the dummy-target Depends
on the main targets, and have the test targets Depends
on the dummy-target.
I'm having a bit of trouble figuring out how to set up the dummy target, but this basically works:
(in top-level SConstruct)
dummy = env.Command('.all_built', 'SConstruct', 'echo Targets built. > $TARGET')
Export('dummy')
(in each sub-directory's SConscript)
Import('dummy')
for target in target_list:
Depends(dummy, targe)
for test in test_list:
Depends(test, dummy)
I'm sure further refinements are possible, but maybe this'll get you started.
EDIT: also worth pointing out this page on the subject.
SCons, как и Make, использует декларативный метод для решения проблемы сборки. Вы не хотите указывать SCons, как делать свою работу. Вы хотите задокументировать все зависимости, а затем позволить SCons решать, как он все строит.
Если что-то выполняется раньше, чем что-то еще, вам нужно создать и подключить зависимости.
Если вы хотите создать dmy touch-файлы. , вы можете создать собственный конструктор, например:
import time
def action(target, source, env):
os.system('echo here I am running other build')
dmy_fh = open('dmy_file','w')
dmy_fh.write( 'Dummy dependency file created at %4d.%02d.%02d %02dh%02dm%02ds\n'%time.localtime()[0:6])
dmy_fh.close()
bldr = Builder(action=action)
env.Append( BUILDERS = {'SubBuild' : bldr } )
env.SubBuild(srcs,tgts)
Очень важно поместить метку времени в фиктивный файл, потому что scons использует хэши md5. Если у вас пустой файл, md5 всегда будет таким же, и он может решить не выполнять последующие шаги сборки. Если вам нужно создать различные настройки для базовой команды, вы можете использовать фабрики функций для изменения шаблона. например,
def gen_a_echo_cmd_func(echo_str):
def cmd_func(target,source,env):
cmd = 'echo %s'%echo_str
print cmd
os.system(cmd)
return cmd_fun
bldr = Builder(action = gen_a_echo_cmd_func('hi'))
env.Append(BUILDERS = {'Hi': bldr})
env.Hi(srcs,tgts)
bldr = Builder(action = gen_a_echo_cmd_func('bye'))
env.Append(BUILDERS = {'Bye': bldr})
env.Bye(srcs,tgts)
Если у вас есть что-то, что вы хотите автоматически добавить в поток сборки scons (например, г. что-то, что сжимает все ваши файлы журнала сборки после того, как все остальное запущено), см. мой вопрос здесь .
Как только в проект будет добавлен файл RESX ресурса, Visual Studio создаст Designer.cs с тем же именем, создав для вас класс со всеми предметами ресурса в качестве статических свойств. Все имена ресурса можно увидеть при вводе точки в редакторе после ввода имени файла ресурса.
Кроме того, можно использовать отражение для циклического перехода через эти имена.
Type resourceType = Type.GetType("AssemblyName.Resource1");
PropertyInfo[] resourceProps = resourceType.GetProperties(
BindingFlags.NonPublic |
BindingFlags.Static |
BindingFlags.GetProperty);
foreach (PropertyInfo info in resourceProps)
{
string name = info.Name;
object value = info.GetValue(null, null); // object can be an image, a string whatever
// do something with name and value
}
Очевидно, что этот метод можно использовать только в том случае, если файл RESX находится в области текущей сборки или проекта. В противном случае используйте метод, предоставляемый «импульсом».
Преимуществом этого метода является то, что вы вызываете фактические свойства, которые были предоставлены вам, с учетом любой локализации, если вы хотите. Однако он довольно избыточен, так как обычно следует использовать безопасный метод прямого вызова свойств ресурсов.
-121--2034719-это не работает оба способа, родитель может построить потомка с помощью метода build_association, но не наоборот.
читать: http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_one
-121--3320752-Решение должно быть таким простым, как это.
Сделать результат тестирования строителей зависит от результата установки построителя
В псевдо:
test = Test(dlls)
result = Install(dlls)
Depends(test,result)
Лучший способ был бы, если бы Test builder фактически отработал dll зависимости для вас, но могут быть все виды причин, он не делает этого.